繁体   English   中英

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

[英]Perl DBIx::Class - Default Values when using new()?

在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。

编辑:修复代码示例中的一些垃圾; 结果我从过时的代码中获取了cp'd。

看起来没有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;
}

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM