has_and_belongs_to_many или полиморфный has_many :through?

Мне трудно понять, как правильно настроить эту ассоциацию.

У меня есть 3 модели: Музыканты, Группы и Менеджеры. С каждым из них может быть связан определенный «уровень» (стресс, счастье и т. д.).

Но я не уверен, как правильно связать мою модель уровней с тремя другими.

Нужен ли мне какой-то полиморфный has_many :through? И как же мне это настроить? Есть ли какой-то другой тип связанного, который мне нужен?

введите здесь описание изображения


person Shpigford    schedule 20.02.2012    source источник
comment
Чтобы уточнить, связан ли Уровень, скажем, с экземпляром Музыканта или со всеми Музыкантами?   -  person bdon    schedule 20.02.2012


Ответы (2)


Если это тот случай, когда вы определяете атрибуты, которые могут быть назначены определенному классу модели, то вы, вероятно, захотите использовать более традиционный подход. Вместо kind используйте что-то вроде record_type и вместо этого создайте область видимости.

Таким образом, для их извлечения вы должны создать метод доступа, а не отношение между любой из ваших сущностей и этим столбцом. Что-то вроде этого:

def levels
  Level.for_record_type(self.class)
end

for_record_type - это область:

scope :for_record_type, lambda { |record_type|
  where(:record_type => record_type.to_s)
}

Не существует соглашения для связывания моделей с классами вместо экземпляров других моделей.

person tadman    schedule 20.02.2012

Да, это будет полиморфная ассоциация:

class Level < ActiveRecord::Base
  belongs_to :leveled, :polymorphic => true # maybe there's a better word than "leveled"
end

class Musician < ActiveRecord::Base
  has_many :levels, :as => :leveled
end

Вам нужно добавить leveled_type и leveled_id в таблицу уровней.

person bdon    schedule 20.02.2012