答案 0 :(得分:0)
我遇到了同样的问题。您可以创建另一个继承自生成的类的类。但是,您需要将表引用以及与正在编辑的类的关系拉过来,但是您可以保留列定义以及生成的类中没有的内容。我基本上为加载器编写了一个帮助程序,它将类生成为“Immutable”命名空间,并在“Mutable”命名空间中为每个类创建一个子项以及表名引用和生成的模型之间的关系。它似乎工作得相当好,我不再需要担心开发人员编辑类的生成部分。我应该在其中一天的博客文章中写下整篇文章。
答案 1 :(得分:0)
我通过Moosifying模式解决了这个问题,然后创建了一组Moose :: Roles,我在schema-> connection()之后应用于Schema类;
有点像这样:
my $schema = My::Schema->connection();
foreach my $source ($schema->sources) {
my $domain_pkg = "My::Domain::$source";
eval "require $domain_pkg";
# ignore failures due to file-not-found
if ($@ && $@ =~/^Can't locate.*INC/) {
# but barf if class doesnt compile
} elsif ($@) {
confess "Failed to load $domain_pkg for $pkg!!: - $@";
# re-register domain class with the resultsource
# and apply the role
} else {
my $schema_pkg = "${pkg}::$source";
$c->register_class($source, $schema_pkg);
use Moose::Util;
# check schema is moosyfied
if ( $schema_pkg->can('meta') ) {
my $meta = $schema_pkg->meta;
eval {
Moose::Util::apply_all_roles($meta, $domain_pkg);
};
if ($@) {
confess "Failed to add $domain_pkg role to $schema_pkg: $@\n";
} else {
l4p->info("Found and applied Domain role: '$domain_pkg' for schema: '$schema_pkg'");
}
} else {
warn "Cant call meta on $schema_pkg. ";
}
}
}
附近..
use MooseX::Declare
role My::Domain::Person {
# modify schema
My::Schema::Person->inflate_column( ..);
My::Schema::Person->belongs_to(..);
My::Schema::Person->set_primary_key(..);
# add some method modifiers to check/modify construction
around new (ClassName $class : $params) {
munge params..
$self->$orig($params);
}
# post insert hook
after insert () {
do_something..
}
# domain methods
sub fullname {
$self->firstname.' '.$self->surname;
}
}
答案 2 :(得分:0)
虽然这在技术上不是问题的答案,但它是解决产生它的合并地狱问题。在致电dbicdump
或make_schema_at
时,您可以设置omit_version
和omit_timestamp
标志,这将生成如下签名:
# Created by DBIx::Class::Schema::Loader
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:CKsL4EO4b/JE3QXBSC4EXg
重新转储时,除非实际表格有,否则此签名不应更改,因此任何版本控制都不会发现不合理的冲突。