Как сделать многократные отношения между многими одинаковыми двумя таблицами - PullRequest
4 голосов
/ 01 июня 2010

У меня есть модель клуба, где я хочу смоделировать две сущности Встреча и Участник.

Между этими двумя сущностями фактически существуют два отношения «многие ко многим», так как для любого собрания Участник может быть либо докладчиком, либо гостем. Теперь я мыслитель ОО, поэтому обычно просто создаю два класса, и каждый из них просто имеет два массива другого внутри, но рельсы заставляют меня думать здесь немного больше о данных, поэтому я понимаю, что мне нужно разбить эти M2M отношения с таблицами соединения Спикеры и гости, которые я сделал, но теперь у меня возникают проблемы с описанием отношений в моделях.

Обе модели таблиц соединений имеют «принадлежат: собрание:» и «принадлежат: член», и я думаю, этого должно быть достаточно.

Я, однако, не уверен насчет моделей Meeting и Member.

У каждого есть "has_many: гости" и "has_many: динамики", но я не уверен, хочу ли я также пойти: has_many: members,: through =>: гости has_many: members,: through =>: докладчики

Но я подозреваю, что это похоже на объявление двух "членов", которые будут конфликтовать.

Я тоже думал о: has_many: гости,: через =>: гости has_many: колонки,: через =>: колонки

Имеет ли это смысл? Как ActiveRecord узнает, что они на самом деле являются его членами?

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

Кто-нибудь получил какие-нибудь советы?

1 Ответ

2 голосов
/ 01 июня 2010

Вам нужно выбрать разные названия ассоциаций, а затем указать модель:

class Meeting
  has_many :guests
  has_many :speakers
  has_many :guest_members, :through => :guests, :source => 'Member'
  has_many :speaker_members, :through => :speakers, :source => 'Member'
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...