DBIx::Class 和重载访问器

DBIx::Class and overloading accessors

(与 #11526999 类似,但具有更具体的细节)

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

有效,但有点麻烦

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

__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\n"; # Added for debugging
  my $date;

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

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

  return $date;
}

这是有效的,因为它 returns 符合预期 2014-10-04,但它是一个障碍。

做正确的事

问题是我破解了校验和的代码,所以我无法巧妙地重新生成我的 Class 对象。

阅读 ResultSource and the CookBook 正确的方法似乎是:

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 直接放在第一个下面 -现在全部可用....代码使用默认访问器,并且 returns 2014-10-04T00:00:00

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

谢谢...

这里你需要的是作为加载程序选项传入的 col_accessor_map

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

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

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

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

更新: 这是未经测试发布的,当我终于开始测试它时,我发现它不起作用。在 IRC 上与 the author 交谈后,我被告知 col_accessor_map 选项不支持这种嵌套哈希方法,所以如果你想使用这种方法,你需要使用代码引用。

不过,作者也同意添加此支持是个好主意,我刚吃完午饭回来发现这个 Github commit 添加了该功能。不过我不知道它多久会到达 CPAN。

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

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

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