2010-01-21 14 views
5

Quando si utilizza il metodo new() su DBIx :: Class ResultSource per creare una variabile (potenzialmente temporanea), non sembra popolare gli attributi con i valori predefiniti specificati nello schema DBIC (che abbiamo specificato per la creazione di tabelle da quello schema).Perl DBIx :: Class - Valori predefiniti quando si utilizza new()?

Attualmente, stiamo creando un valore predefinito per una tale classe (primo caso in cui questo è stato un problema) con

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

in quella classe (cioè, la coda attributo => DEFAULT_QUEUE_VAL). Tuttavia, a lungo termine, abbiamo diverse classi DBIC che hanno vari valori predefiniti, e vorremmo evitare di replicare la logica sopra per tutti i vari casi.

Ci sono moduli/plug-in CPAN disponibili per farlo? Non abbiamo visto nessuno nella nostra (dichiaratamente superficiale) ricerca di CPAN.

Modifica: corretto alcuni dati inutili nel codice di esempio; risulta che cp'd da codice scaduto.

+0

Vale la pena notare che qualsiasi tecnica di questo tipo verrà interrotta se il valore predefinito non è un valore semplice (ad esempio è una chiamata di funzione SQL). Se possibile, si consiglia di inserire la riga nel database (possibilmente all'interno di una transazione per sicurezza) e interrogare il valore della colonna. Fai solo ciò che ti chiedi se quella tecnica non funziona. – hobbs

risposta

2

sembra che non v'è alcuna componente DBIC per questo, è possibile farlo con una piccola modifica al proprio codice esistente però:?

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; 
} 

come è questo dritto in avanti, non c'è molto punto per un componente.

+0

Sembra abbastanza buono; stiamo infatti cercando di rendere tale componente o una modifica effettiva al framework. Ti interessa il merito? – Carl

+0

Suggerirei un componente. E sì;) (CPAN: JROBINSON) – castaway

+0

rock on; ci sono alcuni, uh, problemi strani con noi che fanno contributi direttamente, quindi forse parleremo di farlo attraverso di voi. – Carl

0

non è il codice che chiama queue() come metodo di classe anziché come metodo di oggetto? intendi

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

?

modifica - mi dispiace, appena ri-leggere la domanda, e presumo che è solo un errore di battitura

un pensiero - se il valore di default è nello schema SQL, poi fare è necessario impostare nell'oggetto pure ? se passi attraverso NULL (undef) otterrai il valore predefinito nella tabella, e per riflettere che nell'oggetto set il metodo new() sottoclasse per rileggere la riga db (-> discard_changes() lo farà io credo)

+0

Sfortunatamente, il comportamento del sito dipende dal valore predefinito; quindi è necessario prima che qualcosa venga mai scritto sul tavolo. Cioè, stiamo facendo un record potenziale, che un utente poi manipola e poi scarta o invia, trasformandolo in un vero e proprio record nella tabella. – Carl

+0

scusate, ho perso il bit "variabile temporanea" - rispondevo anche a questa mattina presto! – plusplus

0

Un altro approccio sarebbe quello di avere un campo "salvato" nel database che contrassegni quando lo hai salvato. puoi usare le viste per distinguere tra oggetti salvati e nuovi.

Questo approccio sarà più lento ma consente di rilevare DATETIME o altri valori predefiniti specifici del DB con cui la risposta sopra potrebbe avere problemi.

Problemi correlati