Perl DBIx :: Class - 使用new()时的默认值?

时间:2010-01-21 02:23:57

标签: perl dbix-class

在DBIx :: Class ResultSource上使用new()方法创建(可能是临时的)变量时,似乎不会使用DBIC模式中指定的默认值填充属性(我们已指定用于创建来自该架构的表格。)

目前,我们正在为一个这样的类创建一个默认值(这是第一个出现问题的情况)

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

(即属性queue => DEFAULT_QUEUE_VAL)。但是,从长期来看,我们有几个具有各种默认值的DBIC类,我们希望避免在所有情况下复制上述逻辑。

是否有可用的CPAN模块/插件?我们没有看到任何我们(粗略地粗略地)搜索CPAN。

编辑:在代码示例中修复了一些垃圾;事实证明我是从过时的代码中获得的。

3 个答案:

答案 0 :(得分:2)

看起来没有DBIC组件,你可以用现有代码的一个小mod来做到这一点:

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

由于这是直截了当的,因此组件没有多大意义。

答案 1 :(得分:0)

不是你的代码调用queue()作为类方法而不是对象方法?你的意思是

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

编辑 - 抱歉,只是重新阅读问题,并假设这只是一个错字

一个想法 - 如果默认值在SQL模式中,那么您是否还需要在对象中设置它?如果你通过NULL(undef)你会得到表中的默认值,并反映在对象集中的子类new()方法重新读取db行( - > discard_changes()将执行它我想?)

答案 2 :(得分:0)

另一种方法是在数据库中设置一个“已保存”字段,并在保存时标记该字段。您可以使用视图来区分已保存的对象和新对象。

此方法速度较慢,但​​允许您选择DATETIME或其他特定于数据库的默认值,而上述答案可能会出现问题。