如何使DBIx :: Class :: Schema :: Loader忽略非结果类?

时间:2012-12-27 08:07:39

标签: perl dbix-class

我正在使用动态模式下的DBIx::Class::Schema::Loader切换到静态模式。

但是有一个问题,我的结果类与非结果类混在一起。 Here's the specifics

lib/BackPAN/Index.pm            # main API
lib/BackPAN/Index/Dist.pm       # result class
lib/BackPAN/Index/File.pm       # result class
lib/BackPAN/Index/Release.pm    # result class
lib/BackPAN/Index/Schema.pm     # subclass of DBIC::Schema::Loader
lib/BackPAN/Index/Role/...      # various roles

当我切换到静态模式生成时,它会被角色绊倒。

  

DBIx :: Class :: Schema :: load_namespaces():尝试load_namespaces()   class BackPAN :: Index :: Role :: HasCache失败 - 你确定这是一个   真实的结果类?

我坚持这个班级布局。 BackPAN::Index::DistFileRelease都是公开记录的。由于查询,许多方法都会返回它们。

我需要一种在静态模式下使用DBIx::Class::Schema::Loader的方法,而BackPAN::Index::DistFileRelease用作结果类。

我一直试图让DBIx::Class::Schema::Loader拼出生成的结果类,而不是依靠load_namespaces来搜索子目录。

理想情况下,我希望生成的结果类位于自己的子目录中,DistFileRelease作为子类,以便于自定义。但是,针对模式的查询必须返回自定义的子类。

2 个答案:

答案 0 :(得分:2)

通常,您有一个Result和一个ResultSet命名空间,其中包含相应的类:

BackPAN::Index::Schema::Result::Dist
BackPAN::Index::Schema::ResultSet::Dist

DBIx::Class::Schema#load_namespaces文档显示了将其设置为非默认值的示例。

您还可以使用DBIx::Class::Schema#load_classes并指定每个类:

BackPAN::Index::Schema->load_classes({
    BackPAN::Index => [qw( Dist File Release )],
});

通常将Result和ResultSet类移动到不同的名称空间不是问题,因为它们总是通过加载它们的Schema实例访问。 我建议在使用load_classes之前尝试移动它们并查看它是否真的破坏了。

答案 1 :(得分:0)

我意识到Schema :: Loader的重要部分是创建结果类。架构很简单,我可以手工制作。不幸的是,没有办法告诉Schema :: Loader不生成架构。我把它告诉了make a dummy and just delete the file

DBIx::Class::Schema::Loader::make_schema_at(
    'BackPAN::Index::SchemaThrowaway',
    {
        result_namespace => '+BackPAN::Index',
        use_namespaces   => 1,
        dump_directory   => 'lib',
    },
);

# Throw the generated schema away.
unlink "lib/BackPAN/Index/SchemaThrowaway.pm";

然后我手工编写schema class

package BackPAN::Index::Schema;

use strict;
use warnings;

use base 'DBIx::Class::Schema';

__PACKAGE__->load_classes({
    "BackPAN::Index" => [qw(Dist File Release)],
});

它是一个黑客,但它的工作原理。仍在寻找更好的解决方案。