DBIx :: Class和重载访问器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DBIx :: Class和重载访问器相关的知识,希望对你有一定的参考价值。

(类似于,但更具体的细节,#11526999

我的结果类是使用dbicdump构建的,但我希望重载date字段的默认访问器。

作品,但一个小屋

为了hackytest我的想法,我只是添加一个accessor属性到date调用创建的add_columns键:

__PACKAGE__->add_columns(
  "stamp_id",
  {
    data_type         => "integer",
    is_auto_increment => 1,
    is_nullable       => 0,
    sequence          => "timestamp_stamp_id_seq",
  },
  "date",
  { data_type => "date", is_nullable => 0, accessor => '_date' },
);

...并在Schema :: Loader校验和行下创建了我的访问器例程:

# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:nB5koMYAhBwz4ET77Q8qlA

sub date {
  my $self = shift;
  warn "overloaded date
"; # Added for debugging
  my $date;

  # The date needs to be just the date, not the time
  if ( @_ ) {
    $date = shift;
    if ( $date =~ /^([d-]+)/ ) {
      $date = $1
    }
    return $self->_date($date)
  }

  # Fetch the column value & remove the time part.
  $date = $self->_date;
  if ( $date =~ /^([d-]+)/ ) {
      $date = $1
  }

  return $date;
}

这是有效的,因为它返回预期的2014-10-04,但是是一个躲避。

以正确的方式做到这一点

问题是我已经破解了校验和代码,所以我不能整齐地重新生成我的Class对象。

阅读ResultSourceCookBook正确的方法似乎是:

dbicdump构建的ResultSource作为标准:

__PACKAGE__->add_columns(
  "stamp_id",
  {
    data_type         => "integer",
    is_auto_increment => 1,
    is_nullable       => 0,
    sequence          => "timestamp_stamp_id_seq",
  },
  "date",
  { data_type => "date", is_nullable => 0 },
);

....添加更改行下方的访问者,使用+表示它是对现有定义的更改:

# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:nB5koMYAhBwz4ET77Q8qlA

__PACKAGE__->add_columns(
  "+date", { accessor => '_date' },
);

....像以前一样使用重载方法

不工作。

我已经仔细检查了我的拼写,我已经尝试过add_column而不是add_columns,我已经尝试将第二个add_columns直接放在第一个 - 所有现在都可用....代码使用默认访问器,并返回2014-10-04T00:00:00

如何覆盖默认访问器,以便我可以使用自己的方法?

蒙蔽...

答案

你需要的是一个col_accessor_map作为加载器选项传入。

col_accessor_map => {
  table_name => {
    date => _date,
  }
}

您可以使用dbicdump将加载程序选项传递给-o

$ dbicdump -o col_accessor_map="{ table_name => { date => _date } }" ... other options ...

(将上面的table_name替换为你的桌子名称 - 这很明显,对吧?)

更新:这是未经测试的,当我最终完成测试时,我发现它不起作用。在与IRC上的the author对话后,我被告知col_accessor_map选项不支持这种嵌套哈希方法,所以如果你想使用这种方法,你需要使用coderef。

然而,作者也同意添加这种支持是一个好主意,我刚刚从午餐回来找到这个添加功能的Github commit。我不知道它会多快到达CPAN。

这可能是第一次更新CPAN以使SO答案正确:-)

另一答案

在不同的抽象级别,我相信你可以使用方法修饰符

use Class::Method::Modifier; # or Moose/Moo
around date => sub {...};

以上是关于DBIx :: Class和重载访问器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl 中设置与 DBIx::Class 的多主列 1:n 关系?

使用 DBIx::Class 时如何指定索引长度?

14.VisualVM使用详解15.VisualVM堆查看器使用的内存不足19.class文件--文件结构--魔数20.文件结构--常量池21.文件结构访问标志(2个字节)22.类加载机制概(代码片段

Perl / DBIx :: Class :: Schema :: Loader后缀_2以复制关系名称

Perl DBIx::Class - 是不是可以使用列属性为插入提供默认值

重载“着色器”类中的赋值运算符