2012-02-13 2 views
1

Я хотел бы знать, как настроить отношение от одной модели к другой, но через множество ассоциаций.Установить отношение от одной модели к другой, используя несколько ассоциаций

В этом примере есть Member модель, Sportsorginazation модель, 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 использовать ActiveRecord, а не Array. – Arjan

0

Отношения, подобные этому, могут усложниться, чем стандартные шаблоны ActiveRecord, которые могут вместить, так что вам нужно либо придумать креативное решение, либо вы можете попробовать и отговорить его обратно в коробке.

Одним из подходов, которые могут работать, является создание модели STI для инкапсуляции всех различных видов клубов. Второй подход заключается в том, чтобы связать каждого из членов обратно с соответствующей спортивной организацией напрямую, де-нормализуя атрибут.

Смежные вопросы