2012-12-27 37 views
4

我将动态模式下的DBIx::Class::Schema::Loader切换为静态。如何让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 ::类::架构:: load_namespaces():尝试load_namespaces() 类的背板::首页::角色:: HasCache失败 - 你确定这是一个真正的 结果类?

我被困在这个类的布局。 BackPAN::Index::Dist,FileRelease都是公开记录的。作为查询的结果,预计许多方法会返回它们。

我需要一种方法在静态模式下使用DBIx::Class::Schema::LoaderBackPAN::Index::DistFileRelease作为结果类。

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

理想情况下,我想生成的结果类是在自己的子目录与DistFileRelease作为子类更容易定制。但是,对模式的查询必须返回自定义的子类。

回答

2

通常你有一个结果和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)], 
}); 

通常这不是一个问题,结果和ResultSet类移动到不同的命名空间,因为他们总是通过加载它们的架构的实例访问。 我建议在使用load_classes之前尝试移动它们并查看它是否真的破坏了某些东西。

+0

是的,如果我硬编码班级名单它的作品。麻烦的是,DBIC :: Schema :: Loader使Schema类。我如何从中获得控制权? – Schwern

+0

另外,如果有一种方法,我可以让DBIC :: Schema :: Loader只做结果类而不是方便的模式。 – Schwern

+1

Schema :: Loader假设一个空的名称空间,它在其中生成所有类的类。修改生成的模式(以及其他类)不仅被支持,而且被假定,因为它的目的只是为了让你开始。 –

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)], 
}); 

它的黑客,但它的作品。仍在寻找更好的解决方案。

相关问题