Подтвердить что ты не робот

Полиморфные отношения 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? Я немного смущен, и я не нашел никакой помощи в этом.
  • Будет ли это работать?
4b9b3361

Ответ 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