我想知道如何设置从一个模型到另一个模型的关系,但是通过多个关联。
在此示例中,有一个Member
模型,一个Sportsorginazation
模型,一个Basketballclub
模型和一个Footballclub
模型(为了这个例子,有必要将这些俱乐部定义为不同的模式。)
让我们说这个运动组织有多个篮球俱乐部和多个足球俱乐部。篮球俱乐部和足球俱乐部都有很多成员。
我如何从体育组织中获得所有成员?
我可以想象有类似的东西:
class Sportsorganization
has_many :basketballclubs
has_many :footballclubs
has_many :members, :through => :basketballclubs
end
但我如何从篮球俱乐部和足球俱乐部获得所有成员?我知道你可以为会员制作别名,让Sportsorganization有篮球俱乐部会员和足球俱乐部会员,但是也可以让所有会员使用篮球俱乐部和足球俱乐部吗?
答案 0 :(得分:1)
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。