4

G'Day、

私は DBIx::Class 0.07003 と DBIx::Class::Schema::Loader 0.03009 で作業しており、ローダーによって生成されたクラスの基本クラスを変更しようとしています -- から:

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か?

問題に見えるのは?

注:結果クラスを生成するときは、 neweruse_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 に答える