ポッドキャスト/ラジオ番組のディレクトリとなるアプリを作成しています(主に、各番組のショーノート用)。このアプリで人々をモデル化する方法に行き詰まっています。主な理由は、人が多くの異なるエピソード (多くの異なるショー内) のゲストになることができるだけでなく、ホスト (番組のすべてのエピソードで取り上げられる人物) になることもできるからです。指定されたショー)。
例: Marco Arment は番組「Build and Analyze」のホストですが、他のポッドキャスト (「The Gruber Talk Show」や「This Week in Tech」など) にゲストとして出演することもあります。
これまでのデータ モデルを以下に示します (ホスト/ゲスト エピソード/ショーの関係に焦点を当てています)。「ゲスト」と「ホスト」の役割をアプリ内の個別のアイテムとして保持したいのは確かですが、人/ゲスト/ホスト モデリングにアプローチする方法はわかりません。
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
# ???
「ホスト」モデルと「ゲスト」モデルを取り除き、代わりに、エピソードまたはショーがそれらに関連付けられている人々について問い合わせているかどうかに基づいてこれらのロールを決定する必要がありますか? 「ショー」にはホストのみ、「エピソード」にはゲストのみを含めることができますが、ゲストとホストは常に人 (名前、経歴、Twitter ハンドルなど) であることを忘れないでください。
ありがとう。ポリモーフィック アソシエーションと has_many :through について調査しましたが、どちらを使用すればよいかわかりません。
更新 #1
これで寝た後、朝の対処方法についていくつかのより良いアイデアがありました. 以下の @Emm の応答と同様に、「ホスト」と「ゲスト」は、別のモデルを介して単純にある人の性質であるべきだと思われます。以下の回答を見る前に設定した、モデル構造に関する私の新しい考え方を次に示します。
ここでの主な違いは、「外観」モデルには「ロール」列 (文字列) があり、その行に関連付けられた 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