2010-01-21 2 views
5

При использовании метода new() для источника данных DBIx :: Class ResultSource для создания (потенциально временной) переменной он, похоже, не заполняет атрибуты значениями по умолчанию, указанными в схеме DBIC (которые мы указали для создания таблиц из этой схемы).Perl DBIx :: Class - Значения по умолчанию при использовании new()?

В настоящее время мы создаем одно значение по умолчанию для одного такого класса (первый случай, когда это было проблемой) с

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

в этом классе (то есть, очередь атрибут => DEFAULT_QUEUE_VAL). Однако в долгосрочной перспективе у нас есть несколько классов DBIC, которые имеют разные значения по умолчанию, и мы бы хотели избежать повторения описанной выше логики для всех различных случаев.

Доступны ли модули CPAN/плагины для этого? Мы не видели в нашем (по общему признанию, беглого) поиска CPAN.

Редактировать: исправлено некоторое количество мусора в образце кода; оказывается, я cp'd из устаревшего кода.

+0

Стоит отметить, что любая техника такого рода будет разорвана, если ваше значение по умолчанию не является простым значением (например, это вызов функции SQL). Если это возможно, рекомендуется просто вставить строку в базу данных (возможно, внутри транзакции для обеспечения безопасности) и запросить значение столбца. Делайте то, что вы просите, если эта техника не работает. – hobbs

ответ

2

похоже, что нет DBIC компонент для этого, вы можете сделать это с небольшой мод в существующий код, хотя:

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

Как именно это прямо вперед, нет особого смысла для компонент.

+0

Выглядит неплохо; мы на самом деле стремимся сделать такой компонент или фактическое изменение структуры. Вы заинтересованы в кредите на это? – Carl

+0

Я бы предложил компонент. И да;) (CPAN: JROBINSON) – castaway

+0

rock on; есть некоторые странные проблемы с нами, которые делают взносы напрямую, поэтому, возможно, мы поговорим об этом через вас. – Carl

0

- это не ваша очередь вызова кода() как метод класса, а не метод объекта? вы имели в виду

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

?

редактировать - извините, просто перечитайте вопрос, и предполагают, что это просто опечатка

мысль - если значение по умолчанию находится в схеме SQL, то вам нужно установить его в объекте, а также ? если вы пройдете через NULL (undef), вы получите значение по умолчанию в таблице и чтобы отразить это в наборе объектов, метод подкласса new() для повторного чтения строки db (-> discard_changes() будет делать это i думаю)

+0

К сожалению, поведение сайта зависит от значения по умолчанию; следовательно, это необходимо, прежде чем что-либо когда-либо будет записано в таблицу. То есть мы создаем потенциальную запись, которую пользователь затем манипулирует, а затем либо отбрасывает, либо отправляет, что превращает ее в фактическую запись в таблице. – Carl

+0

извините, пропустил бит «временная переменная» - ответил слишком рано утром! – plusplus

0

Другим подходом было бы иметь «сохраненное» поле в базе данных, которое вы отмечаете, когда вы его сохранили. вы можете использовать представления, чтобы различать сохраненные объекты и новые.

Этот подход будет медленнее, но позволит вам выбрать DATETIME или другие специфичные по БД значения по умолчанию, которые могут иметь проблемы с вышеуказанным ответом.