如何覆盖DBIx :: Class Tables中的“new”方法

时间:2012-09-04 16:59:45

标签: perl dbix-class

我在这里阅读http://search.cpan.org/~frew/DBIx-Class-0.08200/lib/DBIx/Class/Manual/Cookbook.pod#Setting_default_values_for_a_row,为列设置默认值的方法是覆盖 new 方法。

我的问题是我的新方法永远不会被调用。

User.pm

package MyApp::SchemaTest::Result::User;
use strict;
use warnings;
use base qw/DBIx::Class::Core/;

sub new {
    die "new: @_";
}
__PACKAGE__->table("GECKO_USER");
__PACKAGE__->add_columns(
  "user_id",
  { data_type => "integer", is_auto_increment => 1, is_nullable => 0 },
  "first_name",
  { data_type => "varchar2", is_nullable => 0, size => 45 },
  "last_name",
  { data_type => "varchar2", is_nullable => 0, size => 45 } );
__PACKAGE__->set_primary_key("user_id");

1;

test.pl

use Gecko2::SchemaTest;

my $schema = Gecko2::SchemaTest->connect("dbi:SQLite:$FindBin::Bin/../db/gecko2.sqlite");
ok($schema, "got schema");

my $user = $schema->resultset('User')->find( { login => 'toto' });
use DDP;
p $user;

我将$ user对象完全构造并且可操作,这意味着我的全新方法永远不会被调用。 为什么不???

我试图移动它但没有任何成功......

2 个答案:

答案 0 :(得分:2)

我调用查找结果/行对象是根据数据库中的值构造的。 在食谱中描述的情况是用于创建新的行对象,例如通过拨打$ rs->创建。

为什么要覆盖来自数据库的值?

请注意,您还可以使用“default_value”属性为列设置默认值。如果使用new_result构造行对象,则不会设置列值,但如果使用$ schema-> deploy部署数据库,则不会设置数据库默认列值。

如果要设置新行对象的值,请查看DBIx::Class::DynamicDefault

答案 1 :(得分:0)

我最终找到了解决方案:要控制数据库/存储中行对象的实例化,您需要覆盖 inflate_default 方法。

来自doc:

  

从中检索数据的所有DBIx :: Class :: ResultSet方法   数据库并将其转换为行对象调用此方法   (* inflate_default *)。

     

在Result类中扩展此方法以挂接到此进程,   例如,将结果重新评估为不同的类。

当然,如果您需要通过新方法控制行对象的实例化,则必须覆盖它。

总而言之,如果要挂钩行对象的每个可能的实例化,则必须覆盖 inflate_result new