2010-01-21 16 views
5

Al usar el método new() en un DBIx :: Class ResultSource para crear una variable (potencialmente temporal), no parece llenar los atributos con los valores predeterminados especificados en el esquema DBIC (que hemos especificado para crear tablas de ese esquema).Perl DBIx :: Class - Valores predeterminados cuando se usa new()?

Actualmente, estamos creando un valor por defecto para una tal clase (el primer caso en el que esto era un problema) con

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

en esa clase (es decir, la cola de atributo => DEFAULT_QUEUE_VAL). Sin embargo, a más largo plazo, tenemos varias clases de DBIC que tienen varios valores predeterminados, y nos gustaría evitar la replicación de la lógica anterior para todos los casos.

¿Hay módulos/complementos de CPAN disponibles para hacer esto? No vimos ninguno en nuestra búsqueda (evidentemente somera) de CPAN.

Editar: corrigió algunos desperdicios en el ejemplo del código; Resulta que copié de un código desactualizado.

+0

Vale la pena señalar que cualquier técnica de este tipo se romperá si su valor predeterminado no es un valor simple (por ejemplo, es una llamada de función SQL). Si es posible, se recomienda que simplemente inserte la fila en la base de datos (posiblemente dentro de una transacción por seguridad) y vuelva a consultar el valor de la columna. Solo haz lo que estás preguntando si esa técnica no funciona. – hobbs

Respuesta

2

parece que no hay ningún componente DBIC para esto, lo puede hacer con un pequeño mod para el código existente sin embargo:?

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

como se trata de esta recta hacia adelante, no tiene mucho sentido para un componente.

+0

Se ve bastante bien; de hecho, estamos buscando hacer tal componente o un cambio real en el marco. ¿Estás interesado en el crédito sobre eso? – Carl

+0

Sugeriría un componente. Y sí;) (CPAN: JROBINSON) – castaway

+0

rock on; hay algunos, eh, extraños problemas con nosotros haciendo contribuciones directamente, así que quizás hablemos de hacerlo a través de usted. – Carl

0

¿no es su cola de llamadas de código() como un método de clase en lugar de un método de objeto? quisiste decir

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

?

editar - lo siento, simplemente vuelva a leer la pregunta, y suponen que es sólo un error tipográfico

un pensamiento - si el valor por defecto es en el esquema de SQL, y luego hacer lo necesario para ponerlo en el objeto, así ? si pasa por NULL (undef) obtendrá el valor predeterminado en la tabla, y para reflejar que en el objeto establece el método new() subclasificado para volver a leer la fila db (-> discard_changes() lo hará i creo)

+0

Desafortunadamente, el comportamiento del sitio depende del valor predeterminado; por lo tanto, es necesario antes de escribir algo en la mesa. Es decir, estamos haciendo un registro potencial, que un usuario luego manipula y luego descarta o envía, lo que lo convierte en un registro real en la tabla. – Carl

+0

lo siento, me perdí el bit de 'variable temporal' - ¡respondía esto demasiado temprano en la mañana! – plusplus

0

Otro enfoque sería tener un campo 'guardado' en la base de datos que usted marca cuando lo ha guardado. puede usar vistas para distinguir entre objetos guardados y nuevos.

Este enfoque será más lento pero le permitirá seleccionar DATETIME u otros valores predeterminados específicos de DB que la respuesta anterior puede tener problemas.

Cuestiones relacionadas