【问题标题】:Perl DBIx::Class - Default Values when using new()?Perl DBIx::Class - 使用 new() 时的默认值?
【发布时间】:2011-01-07 13:39:38
【问题描述】:

当在 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 搜索中没有看到任何内容。

编辑:修复了代码示例中的一些垃圾;原来我是从过时的代码中复制出来的。

【问题讨论】:

  • 值得注意的是,如果您的默认值不是一个简单的值(例如,它是一个 SQL 函数调用),那么任何此类技术都会中断。如果可能,建议您将行插入数据库(为了安全起见,可能在事务中)并查询回列值。如果该技术不起作用,请仅执行您要求的操作。

标签: perl dbix-class


【解决方案1】:

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

因为它是直截了当的,所以组件没有多大意义。

【讨论】:

  • 看起来不错;事实上,我们正在寻求对框架进行这样的组件或实际更改。您对此有兴趣吗?
  • 我建议一个组件。是的;)(CPAN:JROBINSON)
  • 摇滚吧;我们直接做出贡献有一些,呃,奇怪的问题,所以也许我们会通过你聊聊。
【解决方案2】:

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

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

?

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

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

【讨论】:

  • 不幸的是,站点行为依赖于默认值;因此,在将任何内容写入表之前需要它。也就是说,我们正在创建一个潜在的记录,然后用户对其进行操作,然后丢弃或提交——这会将其变成表中的实际记录。
  • 抱歉,错过了“临时变量”位 - 早上回答这个问题太早了!
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-25
    • 2017-05-17
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 2011-07-09
    相关资源
    最近更新 更多