Установите отношение от одной модели к другой, используя несколько ассоциаций - PullRequest
1 голос
/ 13 февраля 2012

Я хотел бы знать, как настроить отношение от одной модели к другой, но с помощью нескольких ассоциаций.

В этом примере есть модель Member, модель Sportsorginazation, модель Basketballclub и модель Footballclub (для примера необходимо, чтобы эти клюшки были определены как разные модели) .

Допустим, у этой спортивной организации есть несколько баскетбольных клубов и несколько футбольных клубов. Баскетбольные и футбольные клубы имеют много членов.

Как бы я получить всех членов от спортивной организации?

Я могу представить себе что-то вроде:

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

Но как мне получить всех участников из баскетбольных и футбольных клубов? Я знаю, что вы можете создать псевдоним для членов и позволить Sportsorganization иметь членов баскетбольных и футбольных клубов, но возможно ли также, чтобы все участники использовали баскетбольные и футбольные клубы?

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

@ Тадман, насколько я понимаю, прав, но есть наивный способ сделать это:

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 }

Я не проверял это, поэтому может потребоваться некоторая настройка, но это основная идея.

Caveat emptor , однако - с помощью любого из этих методов вы потеряете все удобные методы сбора ActiveRecord (вы просто получите простой старый массив объектов).

0 голосов
/ 13 февраля 2012

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

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

...