【问题标题】:Change inheritance tree of DBIx Class Result classes?更改 DBIx 类结果类的继承树?
【发布时间】:2011-06-24 06:07:01
【问题描述】:

节日,

我正在使用 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 包(属性等)继承东西。我也尝试在 BaseMooseDBI 中覆盖 load_components,但它从来没有被调用-相反,它错误地找不到load_components?

似乎是什么问题?

注意:在生成结果类时,我不能使用较新的 use_mooseresult_base_class

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

【问题讨论】:

    标签: perl dbix-class


    【解决方案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 特定信息(即,调用__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 自动生成其中的一些代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      相关资源
      最近更新 更多