2012-02-13 6 views
1

あるモデルから別のモデルへの関係を設定する方法を知りたいと思います。複数の関連付けを使用して、あるモデルから別のモデルへの関係を設定する

この例でMemberモデル、Sportsorginazationモデル、BasketballclubモデルとFootballclubモデル(この例のために、別のモデルとして定義され、これらのクラブを持っていることが必要である)があります。

このSportsorganizationには、複数のBasketballclubと複数のFootballclubがあるとします。バスケットボールクラブとフットボールクラブには多くのメンバーがいます。

私はどのようにスポーツ会員からすべてのメンバーを得ることができますか?

私のようなものを持って想像することができます:

class Sportsorganization 
    has_many :basketballclubs 
    has_many :footballclubs 
    has_many :members, :through => :basketballclubs 
end 

しかし、私はbasketballclubsとfootballclubsの両方からすべてのメンバーを取得する方法を?メンバーのエイリアスを作って、Sportsorganizationにバスケットボールクラブ会員とフットボールクラブ会員がいることを知っていますが、バスケットボールクラブとサッカークラブを使ってすべてのメンバーを獲得することも可能ですか?

答えて

1

@tadmanは私に関する限り正しいですが、これを行うには素朴な方法があります:

has_many :basketballclub_members, :through => :basketballclubs, :class_name => 'Member' 
has_many :footballclub_members, :through => :footballclubs, :class_name => 'Member' 

def all_members 
    basketballclub_members + footballclub_members 
end 

これは非常に、ナイーブしかし-you'dはおそらく(memoizeたいですキャッシュ)には、例えば+という結果が返されます。

少し少ないナイーブはcomposed_ofを使用することです、例えば:

has_many :basketballclub_members, :through => :basketballclubs, :class_name => 'Member' 
has_many :footballclub_members, :through => :footballclubs, :class_name => 'Member' 

composed_of :members, [ 'basketballclub_members', 'footballclub_members' ], 
    :class_name => 'Array', 
    :constructor => proc {|bb_members, fb_members| bb_members + fb_members } 

それはいくつかの調整が必要な場合がありますので、私はこれをテストしていませんが、それは基本的な考え方です。

Caveat Emptorこれらの方法のいずれかを使用すると、便利なActiveRecordコレクションメソッドをすべて失うことになります(古いオブジェクトの配列を取得するだけです)。

+0

ありがとう、私はcompose_ofにArrayではなくActiveRecordを使用するように(簡単な)方法はないと思います。 – Arjan

0

このような関係は、ActiveRecordの標準パターンよりも複雑になる可能性があるため、創造的な解決策を考え出す必要があります。あるいは、箱に戻して試してみることもできます。

さまざまな種類のクラブをすべてカプセル化するためのSTIモデルを作成することが効果的です。第2のアプローチは、アトリビュートを逆正規化することによって、各メンバを関連付けられたSportsorganizationに直接関連付けることです。

関連する問題