2012-02-13 43 views
1

我想知道如何建立从一个模型到另一个模型的关系,但是需要通过多个关联。使用多个关联从一个模型到另一个模型设置关系

在这个例子中有一个Member模型,Sportsorginazation模型,Basketballclub模型和Footballclub模型(在这个例子中,有必要具有定义为不同型号这些俱乐部的缘故)。

假设这个体育组织有多个篮球俱乐部和多个足球俱乐部。篮球俱乐部和足球俱乐部都有很多成员。

我如何获得体育组织的所有成员?

我能想象到有类似:

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

但我怎么会得到来自basketballclubs和footballclubs双方所有成员?我知道你可以给会员制造一个别名,并让体育组织拥有篮球俱乐部成员和足球俱乐部成员,但是是否有可能让所有成员使用篮球俱乐部和足球俱乐部?

回答

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 

这是非常幼稚,但 - 你会可能想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 } 

我没有测试此所以它可能需要一些调整,但是这是基本的想法。

警戒空洞尽管这些方法中的任何一种都会失去所有方便的ActiveRecord收集方法(您只会得到一个普通的旧对象数组)。

+0

谢谢,我想没有(简单)的方法来告诉compose_of使用ActiveRecord而不是Array。 – Arjan 2012-02-14 15:41:28

0

像这样的关系可能比ActiveRecord的标准模式可以容纳的更复杂,因此您需要想出一个创造性的解决方案,或者您可以尝试并将其重新装箱。

可能工作的一种方法是创建一个STI模型来封装所有不同种类的俱乐部。第二种方法是将每个成员通过去归一化属性直接关联到相关的体育组织。

相关问题