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 {...};
(与 #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 {...};