HABTM Полиморфные Отношения - PullRequest
25 голосов
/ 06 августа 2011

Я довольно новичок в Rails, и я пытаюсь создать полиморфные отношения HABTM.Проблема в том, что у меня есть три модели, которые я хочу связать.

Первая - это модель события, а затем два типа участников: пользователи и контакты.

Что я хочу сделатьдолжен иметь возможность общаться как с пользователями, так и с контактами.Итак, в моем коде сейчас есть:

Модель события

has_and_belongs_to_many :attendees, :polymorphic => true

Модель пользователя

has_and_belongs_to_many :events, :as => :attendees

Модель контакта

has_and_belongs_to_may :events, :as => :attendees
  1. Каким должен быть перенос таблицы HABTM?Я немного сбит с толку, и я не нашел помощи по этому поводу.
  2. Это сработает?

Ответы [ 2 ]

61 голосов
/ 06 августа 2011

Нет, вы не можете этого сделать, нет такой вещи, как полиморфная ассоциация has_and_belongs_to_many.

Что вы можете сделать, так это создать среднюю модель.Вероятно, это будет примерно так:

class Subscription < ActiveRecord::Base
  belongs_to :attendee, :polymorphic => true
  belongs_to :event
end

class Event < ActiveRecord::Base
  has_many :subscriptions
end

class User < ActiveRecord::Base
  has_many :subscriptions, :as => :attendee
  has_many :events, :through => :subscriptions
end

class Contact < ActiveRecord::Base
  has_many :subscriptions, :as => :attendee
  has_many :events, :through => :subscriptions
end

Таким образом модель подписки ведет себя как таблица ссылок в отношении N: N, но позволяет вам иметь полиморфное поведение с событием.

0 голосов
/ 07 сентября 2012

Resolveu parcialmente.

Это решает проблему с учетом имеющейся у нас структуры, но добавляет «ненужную» сложность и код.Создав промежуточную модель (которую я назову B), и учитывая, что A -> B -> C является «A has_many B's, который has_many C's», мы получаем другую модель AR, которая загружает еще одну реализацию класса AR в память, как только она будетзагружен, и будет создан для единственной цели достижения экземпляров Си.Вы всегда можете сказать, что если вы используете ассоциацию: through, вы не загружаете ассоциацию B, но тогда у вас останется еще более устаревшая модель, которая будет там только для того, чтобы увидеть проезд каравана.

Фактически, это может быть функция, отсутствующая в Active Record.Я бы предложил добавить его в качестве функции, поскольку это вызывало у меня беспокойство (именно так я попал в этот пост в надежде найти решение :)).

Cumprimentos

...