首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使DBIx::Class::Schema::加载器忽略非结果类?

如何使DBIx::Class::Schema::加载器忽略非结果类?
EN

Stack Overflow用户
提问于 2012-12-27 08:07:38
回答 2查看 513关注 0票数 4

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

但是有个问题,我的结果类和非结果类混在一起。具体情况如下

代码语言:javascript
复制
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()类BackPAN::Index::load_namespaces::HasCache失败-您确定这是一个真实的结果类吗?

我被这个班级布局困住了。BackPAN::Index::DistFileRelease都是公开记录的。预期许多方法将作为查询的结果返回它们。

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2012-12-27 08:53:07

通常,您有一个结果和一个ResultSet名称空间,对应的类驻留在其中:

代码语言:javascript
复制
BackPAN::Index::Schema::Result::Dist
BackPAN::Index::Schema::ResultSet::Dist

命名空间文档显示了将它们设置为非默认值的示例。

您还可以使用并指定每个类:

代码语言:javascript
复制
BackPAN::Index::Schema->load_classes({
    BackPAN::Index => [qw( Dist File Release )],
});

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

票数 2
EN

Stack Overflow用户

发布于 2012-12-27 10:12:09

我意识到了Schema的重要部分::Loader正在生成结果类。这个模式很简单,我可以手工制作它。不幸的是,没有办法告诉Schema::Loader不生成模式。我把这件事告诉了制作一个虚拟文件,然后删除该文件,就把它黑了。

代码语言:javascript
复制
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";

然后我用手写模式类

代码语言:javascript
复制
package BackPAN::Index::Schema;

use strict;
use warnings;

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

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

这是一次黑客攻击,但有效。还在寻找更好的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14051408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档