5

当在 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 来自过时的代码。

4

3 回答 3

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

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

于 2010-01-26T07:17:33.803 回答
0

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

这种方法会更慢,但允许您选择 DATETIME 或上面的答案可能存在问题的其他数据库特定默认值。

于 2010-07-23T07:35:38.050 回答
0

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

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

?

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

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

于 2010-01-21T10:51:09.567 回答