1

目前我们使用DBIx::Class::Schema::Loader来生成和重新生成(当我们的 db 模式更改时)一组 Result 类。

我们在这些类的底部添加了额外的关系和方法,当人们重新生成或更改模式时,这会导致合并地狱。

我们希望在一组单独的文件中维护我们的自定义更改,这些文件与自动生成的文件并行。

有没有一种简单、干净、推荐的方法?

4

3 回答 3

0

我遇到了同样的问题。您可以创建另一个从生成的类继承的类。但是,您需要将表引用和关系拉到您正在编辑的类中,但是您可以将列定义以及不在生成的类中的内容保留下来。我基本上为加载器编写了一个帮助程序,它将类生成到“不可变”命名空间中,并在“可变”命名空间中为每个类创建一个子级,以及表名引用和生成模型的关系。它似乎工作得相当好,我不再需要担心开发人员编辑类的生成部分。这些天我可能应该在一篇博文中写下整个事情。

于 2010-10-01T20:30:53.457 回答
0

我通过 Moosifying 模式解决了这个问题,然后在 schema->connection(); 之后创建了一组应用于模式类的 Moose::Roles;

它有点像这样:

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;
    }



}
于 2010-10-04T13:39:36.013 回答
0

虽然这在技术上不是问题的答案,但它是产生它的合并地狱问题的解决方案。调用dbicdumpormake_schema_at时,您可以设置omit_versionandomit_timestamp标志,这将生成如下签名:

# Created by DBIx::Class::Schema::Loader
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:CKsL4EO4b/JE3QXBSC4EXg

重新转储时,除非实际表更改,否则此签名不应更改,因此任何版本控制都不会看到不合理的冲突。

于 2014-08-14T21:08:34.090 回答