0

ポッドキャスト/ラジオ番組のディレクトリとなるアプリを作成しています(主に、各番組のショーノート用)。このアプリで人々をモデル化する方法に行き詰まっています。主な理由は、人が多くの異なるエピソード (多くの異なるショー内) のゲストになることできるだけでなく、ホスト (番組のすべてのエピソードで取り上げられる人物) になることもできるからです。指定されたショー)。

例: 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
4

3 に答える 3

0

ショーにはホストを通じて多くのユーザーがいます

番組には多くのエピソードがあります

エピソードにはゲストを通じて多くのユーザーがいます

class User < ActiveRecord::Base
  has_many :shows, :through => :show_hosts
  has_many :show_hosts

  has_many :episodes, :through => :show_guests
  has_many :show_guests
end
于 2013-03-22T04:05:33.830 に答える
0

ホストとゲストを分離しないことをお勧めします。ゲストは、HABTMを使用して自己参照関係として定義できます。

モデル定義は次のようになります。

class Host < ActiveRecord::Base
  has_and_belongs_to_many :guest, 
      :join_table => 'guests' #This is HABTM join table that you will have to create
      :foreign_key => 'host_id'
      :association_foreign_key => 'guest_id'
      :class_name => 'Host'


#The migration will look like this,
def change
  create_table :guests :id => false do |t|
    t.integer :host_id,  :null => false
    t.integer :guest_id, :null => false
  end
  add_index :guests, [:host_id, :guest_id]
end
于 2013-03-22T04:08:02.183 に答える
0

2 つの異なるモデルについて話しているだけなので、簡単に説明します。PeopleHost、およびGuestPerson;に結合しましょう。Episodeと を組み合わせてShowにしましょうPodcast。ホストとゲストの間の役割の違いは、別の場所で定義できます。

class Person < ActiveRecord::Base
  attr_accessible :name, :biography, :twitter
  has_many :podcasts
  has_many :podcasts, :through => :roles
end

class Podcast < ActiveRecord::Base
  attr_accessible :title
  has_many :persons
  has_many :persons, :through => :roles
end

class Role < ActiveRecord::Base
  attr_accessible :variety
  belongs_to :podcast
  belongs_to :person
end

との間の関係のタイプに格納しvarietyます。またはのような文字列にすることも、それを管理するために呼び出される別のモデルを作成することもできます(したがって、 inの代わりに保存します)。RolePersonPodcast"host""guest"Varietyvariety_idvarietyRole

于 2013-03-22T04:04:47.960 に答える