使用多个关联设置从一个模型到另一个模型的关系

时间:2012-02-13 17:24:39

标签: ruby-on-rails associations has-many-through relation

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

在此示例中,有一个Member模型,一个Sportsorginazation模型,一个Basketballclub模型和一个Footballclub模型(为了这个例子,有必要将这些俱乐部定义为不同的模式。)

让我们说这个运动组织有多个篮球俱乐部和多个足球俱乐部。篮球俱乐部和足球俱乐部都有很多成员。

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

我可以想象有类似的东西:

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

但我如何从篮球俱乐部和足球俱乐部获得所有成员?我知道你可以为会员制作别名,让Sportsorganization有篮球俱乐部会员和足球俱乐部会员,但是也可以让所有会员使用篮球俱乐部和足球俱乐部吗?

2 个答案:

答案 0 :(得分: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

这是非常天真,但是你可能想要记住(缓存)+的结果,例如。

稍微不那么天真就是使用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集合方法(你只需要获得一个简单的旧对象数组)。

答案 1 :(得分:0)

像这样的关系比ActiveRecord的标准模式可以容纳的更复杂,所以你需要提出一个创造性的解决方案,或者你可以尝试在框中重新加入它。

可能有效的一种方法是创建一个STI模型来封装所有不同类型的俱乐部。第二种方法是通过对属性进行反规范化,将每个成员直接关联回相关的Sportsorganization。