2015-01-09 96 views
0

我想在DBIX :: Class中使用多個結果類的公共基類。原因是 - 我有幾張結構相同但名稱不同的表格。DBIX ::類繼承結果類

這裏是我的基類

use utf8; 
package myapp::Schema::tablebase; 

use strict; 
use warnings; 

use base 'DBIx::Class::Core'; 

__PACKAGE__->table("unknown"); 

__PACKAGE__->add_columns(
    "id", 
    { data_type => "smallint", is_nullable => 0 } 

    #, ... and lot more 
); 

下面是實際結果類

package myapp::Schema::Result::ActualTable; 
use base 'myapp::Schema::tablebase'; 
# Correct table name 
__PACKAGE__->table('patient2'); 
1; 

我收到編譯錯誤,這一努力。請幫助我。

更新:

我得到的錯誤是 -

DBIx ::類::模式::趕上{...}():嘗試load_namespaces()類的myapp :: Schema :: Result :: ActualTable失敗 - 您確定這是一個真正的Result類嗎?:無法通過包「myapp :: Schema :: Result :: ActualTable」在C:/ Strawberry/perl找到對象方法「result_source_instance」 /site/lib/DBIx/Class/Schema.pm line 195. at C:/Strawberry/perl/site/lib/myapp/Schema.pm

+2

如果您收到編譯錯誤,那麼向我們顯示錯誤消息的確切內容會很有幫助。 –

回答

2

這應該有效,也許是因爲你的基類是在最後缺少真正的返回值(1;)?

如果您更喜歡整潔的解決方案,也可以修復您的基類可能已定義的關係,您也可以使用DBIx::Class::Helper::Row::SubClass

+0

如何使用DBIx :: Class :: Helper :: Row :: SubClass爲單個結果類創建多個子類,每個子類都有不同的表名。它允許我創建一個只有在與基類名稱完全相同的子類時。 – bvnbhati

+0

查看源代碼顯示了兩個選項:覆蓋set_table或僅在子類(首選)後調用表。 –

+0

感謝您的一致支持。我可以解決同樣的問題沒有任何子分類提供我可以以某種方式使用結果類表名稱和關係的運行時變量。 – bvnbhati

0

以下是我對方法「子類」和「生成關係」所做的更改,以保留全局表和客戶端特定表之間的各種關係。此外,我不得不從全局的反向關係中刪除許多客戶特定的表。

sub subclass { 
    my $self = shift; 
    my $client_id = shift; 
    $self->set_table($client_id); 
    $self->generate_relationships($client_id); 
} 

sub generate_relationships { 
    my $self = shift; 
    my $client_id = shift; 
    my ($namespace) = get_namespace_parts($self); 
    foreach my $rel ($self->relationships) { 
    my $rel_info = $self->relationship_info($rel); 
    my $class = $rel_info->{class}; 

    assert_similar_namespaces($self, $class); 
    my (undef, $result) = get_namespace_parts($class); 

    eval "require $class"; 
    # relation of self with global table e.g. person to zipcode or guarantor2 to person 
    # Copy relation as is 
    if($class->is_global == 1){ 
     $self->add_relationship(
     $rel, 
     "${namespace}::$result", 
     $rel_info->{cond}, 
     $rel_info->{attrs} 
    ); 
    }else{ 
    # relation with client specific table e.g. patient2 has many guarantor2, person has many guarantor2 
    # skip if self is global ( person has many guarantor2/3/4 etc) 
     if($client_id ne ''){   
    # need client id mention in result class with which self is related 
     $self->add_relationship(
      $rel, 
      "${namespace}::$result"."$client_id", 
      $rel_info->{cond}, 
      $rel_info->{attrs} 
     ); 
     } 
    }   
    }; 
} 

對於每個子類,我將client_id作爲參數傳遞,對於全局表是空白的。