2012-12-27 57 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)], 
}); 

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

相關問題