Perl DBIx :: Class - Значения по умолчанию при использовании new ()? - PullRequest
5 голосов
/ 21 января 2010

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

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

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 из устаревшего кода.

Ответы [ 3 ]

2 голосов
/ 26 января 2010

Похоже, что для этого нет компонента 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 голосов
/ 23 июля 2010

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

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

0 голосов
/ 21 января 2010

Ваш код не вызывает queue () как метод класса вместо метода объекта? Вы имели в виду

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

edit - извините, просто перечитайте вопрос и предположите, что это просто опечатка

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

...