2010-01-21 14 views
5

Podczas korzystania z metody new() w obiekcie wynikowym źródła danych DBIx :: Class do utworzenia (potencjalnie tymczasowej) zmiennej, wydaje się, że nie wypełnia ona atrybutów wartościami domyślnymi określonymi w schemacie DBIC (który określono dla tworzenia tabel z tego schematu).Perl DBIx :: Class - wartości domyślne przy użyciu new()?

Obecnie tworzenia jednej wartości domyślnej dla jednego z tych kategorii (to pierwszy przypadek, gdy jest to problem) z

sub new { 
    my $class = shift; 
    my $self = $class->next::method(@_); 
    $self->queue('DEFAULT_QUEUE_VAL') unless $self->queue(); 
    return $self; 
} 

w tej klasie (np kolejka atrybut => DEFAULT_QUEUE_VAL). Jednak w dłuższej perspektywie mamy kilka klas DBIC, które mają różne wartości domyślne, i chcielibyśmy uniknąć replikacji powyższej logiki dla wszystkich różnych przypadków.

Czy są dostępne jakieś moduły/wtyczki CPAN? Nie widzieliśmy żadnego w naszych (wprawdzie pobieżnych) poszukiwaniach CPAN.

Edytuj: poprawiono niektóre śmieci w próbce kodu; okazuje się, że kupiłem z nieaktualnego kodu.

+0

Warto zauważyć, że jakakolwiek technika tego rodzaju zostanie przerwana, jeśli domyślna wartość nie jest prostą wartością (np. Jest to wywołanie funkcji SQL). Jeśli to możliwe, zaleca się wstawienie wiersza do bazy danych (prawdopodobnie w ramach transakcji dla bezpieczeństwa) i zapytanie o wartość kolumny. Rób to, o co pytasz, jeśli ta technika nie działa. – hobbs

Odpowiedz

2

wygląda na to, nie ma komponent DBIC do tego, można to zrobić z małym mod do istniejącego kodu chociaż:

sub new { 
    my $class = shift; 
    my $self = $class->next::method(@_); 
    foreach my $col ($self->result_source->columns) { 
    my $default = $self->result_source->column_info($col)->{default_value}; 
    $self->$col($default) if($default && !defined $self->$col()); 
    return $self; 
} 

jak to jest proste, nie ma sensu dla składnik.

+0

Wygląda całkiem nieźle; w rzeczywistości szukamy takiego komponentu lub rzeczywistej zmiany w ramach. Czy jesteś zainteresowany kredytem? – Carl

+0

Proponuję komponent. I tak;) (CPAN: JROBINSON) – castaway

+0

rock on; są pewne, hm, dziwne problemy z nami bezpośrednio, więc może porozmawiamy o tym, robiąc to za Ciebie. – Carl

0

nie jest twoją kolejką wywołania kodu() jako metodą klasy zamiast metody obiektowej? miałeś na myśli

$new->queue('DEFAULT_QUEUE_VAL') unless $new->queue(); 

?

edycja - Przepraszam, po prostu ponownie przeczytać pytanie, a przypuszczam, że to tylko literówka

myśl - jeśli wartość domyślna to w schemacie SQL, a następnie zrobić trzeba ustawić go w obiekcie, jak również ? jeśli przejdziesz przez NULL (undef) otrzymasz domyślną wartość w tabeli, i aby odzwierciedlić to w zestawie obiektów, podklasy metody new(), aby ponownie odczytać wiersz db (-> discard_changes() zrobi to i myślę)

+0

Niestety zachowanie witryny zależy od wartości domyślnej; dlatego jest to konieczne, zanim cokolwiek zostanie zapisane na stole. Oznacza to, że tworzymy potencjalną płytę, którą następnie użytkownik manipuluje, a następnie odrzuca lub przesyła - co zamienia ją w rzeczywisty rekord w tabeli. – Carl

+0

Przepraszam, brakowało mi trochę "zmiennej tymczasowej" - odpowiadałem na to zbyt wcześnie rano! – plusplus

0

Innym podejściem byłoby posiadanie "zapisanego" pola w bazie danych, które zaznaczysz po zapisaniu. możesz użyć widoków, aby odróżnić zapisane obiekty od nowych.

Podejście to będzie wolniejsze, ale pozwoli Ci wybrać DATETIME lub inne domyślne ustawienia DB, na które powyższa odpowiedź może mieć problemy.

Powiązane problemy