4

节日,

我正在使用 DBIx::Class 0.07003 和 DBIx::Class::Schema::Loader 0.03009 并且我正在尝试更改 Loader 生成的类的基类 - 从:

package S2S::DBIxperiment::Productions;

# Created by DBIx::Class::Schema::Loader v0.03009 @ 2011-06-24 14:29:13

use base 'DBIx::Class';

__PACKAGE__->load_components("PK::Auto", "Core");

类似于:

package S2S::DBIxperiment::Productions;

# Created by DBIx::Class::Schema::Loader v0.03009 @ 2011-06-24 14:29:13

use base 'BaseMooseDBI';

__PACKAGE__->load_components("PK::Auto", "Core");

其中 BaseMooseDBI 看起来像:

package BaseMooseDBI;

use Moose;

use base qw(DBIx::Class);

但是,这似乎根本不起作用,并且它似乎没有从BaseMooseDBI包(属性等)继承东西。我也尝试过覆盖load_componentsBaseMooseDBI但它从未被调用 - 而是它无法找到的错误load_components

似乎是什么问题?

注意:我不能在生成结果类时use_moose使用较新的。result_base_class

编辑:找到解决方案。看到了 DBIx::Class::Schema::Loader现在是如何做到的,有 Mutable 和 Immutable 结果类。

4

1 回答 1

1

如果您只想向父类添加一些方法等,您的代码应该可以工作。您可能需要use MooseX::NonMoose,过去我有父子类DBIx::Class::Core而不是DBIx::Class. 这是我成功使用的:

# Parent
package App::Schema::Result;
use Moose;
use MooseX::NonMoose;
use namespace::autoclean;
extends 'DBIx::Class::Core';
sub parent_method { ... }

# Child
package App::Schema::Result::Product;
use Moose;
use MooseX::NonMoose;
use namespace::autoclean;
extends 'Keystone::Schema::Site::Result';
__PACKAGE__->table('products');

sub child_method {
   my ($self) = @_;
   $self->parent_method();
}

如果您希望父类定义DBIx::Class特定信息(即 call __PACKAGE->table__PACKAGE__->add_columns等),请查看DBIx::Class::Helper::Row::SubClass. 使用它,您可以像定义普通类一样定义父类,DBIx::Class::Result::*并在子类中使用该SubClass组件并调用subclass

# Parent
package App::Schema::Result::Parent;
use Moose;
use MooseX::NonMoose;
extends 'DBIx::Class';
__PACKAGE__->load_components(qw{InflateColumn::DateTime Core});
__PACKAGE__->table('products');
...
# Child
package App::Schema::Result::Child;
use Moose;
use MooseX::NonMoose;
extends 'App::Schema::Result::Parent';
__PACKAGE__->load_components(qw{Helper::Row::SubClass Core});
__PACKAGE__->subclass;
# Now add the child specific stuff / override parent stuff

我不确定您是否可以Loader自动生成其中的一些代码。

于 2011-11-26T17:25:46.097 回答