2009-03-13 4 views
2

:私はチェーンシンプルで親クラスの外でそれを容易に行うことができますDBIx :: Classで「親からhas_many GrandChildrenから子へ」の関係を持つことはできますか?私はこのような機能を持っているしたいと思い

$parent->get_grandchildren_by_category({category => 'foo'}); 

参加:

$schema->resultset('Parent')->search(
    { 
     'me.id' => 62, 
     'grandchildren.category' => 'foo' 
    }, 
    { 
     join => {'children' => 'grandchildren'} 
    } 
); 

しかし、親クラス内の私はドン」スキーマ・オブジェクトへのアクセス権(およびスキーマ・オブジェクトにアクセスすべきではない)があります。 親クラスの中で私は$self->childrenにアクセスすることができますが、子の結果セットを返します。それぞれを返すように繰り返す必要があります。grandchildren

このActiveRecordスタイルを定義する方法はありますか?

class Parent < ActiveRecord::Base 
    has_many :children 
    has_many :grandchildren, :through => :children 
end 

答えて

1

私は#dbix-classから多くの助けを得ました。 :throughのActiveRecordスタイルの関係を明示的に定義する方法はないかもしれませんが、子を結果チェーンのさらに下につかむ方法があります。

ResultSetsearch_relatedメソッドを使用すると、関係を調べて子のアクセサを使用できます。例えば、私の親クラスで:search_relatedは、結果セットを返すので

sub get_grandchildren_by_category{ 
    my ($self, $category) = @_; 
    my @gchildren = $self->children->search_related('grandchildren' 
     { 
      'grandchildren.category' => $category 
     } 
    ); 

    return \@gchildren; 
} 

、私はあなたが限りあなたが望むよう呼び出すsearch_relatedそれらをチェーンことができると思います。

+0

ここで間違っているかもしれませんが、 '_rs'は通常は結果セットを表します。 @gchild_rsは実際には行オブジェクトの集合です。混乱を避けるため、スカラーコンテキストで呼び出すか、search_relatedの代わりにsearch_related_rsを使用してください。 – gpojd

関連する問題