Полиморфные отношения HABTM
Я новичок в Rails, и я пытаюсь сделать полиморфное отношение HABTM. Проблема в том, что у меня есть три модели, которые я хочу рассказать.
Первая - это модель Event, а затем два вида участников: пользователи и контакты.
Что я хочу сделать, так это иметь возможность общаться как с посетителями, так и с пользователями. Итак, что я имею прямо сейчас в своем коде:
Модель событий
has_and_belongs_to_many :attendees, :polymorphic => true
Модель пользователя
has_and_belongs_to_many :events, :as => :attendees
Модель контактов
has_and_belongs_to_may :events, :as => :attendees
- Как должна быть миграция таблицы HABTM? Я немного смущен, и я не нашел никакой помощи в этом.
- Будет ли это работать?
Ответы
Ответ 1
Нет, вы не можете этого сделать, нет такой вещи, как полиморфная ассоциация 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
Таким образом, модель Subscription ведет себя как таблица ссылок в отношении N: N, но позволяет вам иметь полиморфное поведение для события.
Ответ 2
Резолюция parcialmente.
Он решает проблему, учитывая рамки, которые мы имеем в нашем распоряжении, но добавляет "ненужную" сложность и код. Создав промежуточную модель (которую я буду называть B), и учитывая, что A → B → C является "A has_many B, у которого has_many C", у нас есть еще одна модель AR, которая загрузит еще одну реализацию AR-класса в память, загружается и будет создавать экземпляры с единственной целью - дойти до экземпляров C. Вы всегда можете сказать, что если вы используете: через ассоциацию, вы не загружаете ассоциацию B, но тогда вы останетесь с еще более устаревшей моделью, которая будет только там, чтобы увидеть проход каравана.
На самом деле это может быть функция, отсутствующая в Active Record. Я бы предложил это как возможность добавить, так как это вызывало у меня беспокойство (как я приземлился в этом посте, надеясь найти решение:)).
Cumprimentos