Я создаю приложение, которое будет каталогом для подкастов/радиопередач (в основном, для показаний каждого шоу). Я зациклился на том, как моделировать людей в этом приложении, главным образом потому, что человек может быть и гостем на многих разных эпизодах (на многих разных шоу), но также может быть хозяином (кто-то, кто показан на каждом эпизоде данного шоу).Rails Model Association для каталога подкастов (Polymoprhic или HABTM)
Пример: Marco Arment является ведущим шоу «Build and Analyze», но может выступать в качестве гостя на случайных других подкастах (таких как «The Gruber Talk Show» или «This Week in Tech»).
Моя модель данных пока показана ниже (с упором на эпизод хоста/гостевого эпизода/шоу). Я не уверен, как подойти к моделированию Person/Guest/Host, хотя я уверен, что хочу сохранить роли «Гость» и «Хост» в качестве отдельных элементов в приложении.
Episode
title:string
has_many :guests
Show
title:string
has_many :hosts
Host
show_id:integer
person_id:integer
belongs_to :show
Guest
episode_id:integer
person_id:integer
belongs_to :episode
People
name:string
# ???
Должен ли я просто избавиться от «хозяина» и модели «гостей», и вместо того, чтобы определить эти ролики в зависимости от того, что Эпизоды или отображение запрашивает о людях, связанных с ними? Помните, что в «Шоу» могут быть только хосты, а «Эпизод» может иметь только гостей, но гости и хосты всегда люди (имя, биография, твиттер и т. Д.).
Спасибо. Я исследовал полиморфную ассоциацию и has_many: через и не уверен, что использовать, если и так.
UPDATE # 1
После сна на это, у меня были лучшие идеи о том, как справиться с этим утром. Как и в ответе @ Emm ниже, кажется естественным, что «Host» и «Guest» должны просто быть некоторым качеством Person через отдельную модель. Вот мое новое мышление о структуре модели, которую я настраивал, прежде чем увидеть какой-либо из ответов ниже.
Главное отличие заключается в том, что модель «Appearancehip» имела бы столбец «role» (строка), где я мог бы установить, был ли person_id, связанный с этой строкой, «гостем» или «хостом» для этой эпизода episode_id или show_id.
class Appearanceship
# person_id:integer
# episode_id:integer
# show_id:integer
# role:string
belongs_to :people
belongs_to :episodes
belongs_to :shows
end
class Person
# name, bio, profile pic, twitter name, etc
has_many :appearanceships
has_many :episodes, :through => :appearanceships
has_many :shows, :through => :appearanceships
end
class Episode
# title, summary, date recorded, mp3 URL, web URL, etc
has_many :appearanceships
has_many :people, :through => :appearanceships
end
class Show
# title, description, web URL, RSS URL, etc
has_many :appearanceships
has_many :people, :through => :appearanceships
end
class Network
# e.g., "NPR", "5by5", "Mule Radio Syndicate", "Revision3"
# title, description, web URL, etc
has_many :shows
end