0

我正在创建一个应用程序,它将成为播客/广播节目的目录(主要是每个节目的节目说明)。我被困在如何在这个应用程序中为人物建模,主要是因为一个人既可以是许多不同剧集的嘉宾(在许多不同的节目中),也可以是主持人(在每一集都有特色的人)给定节目)。

示例:Marco Arment 是“构建和分析”节目的主持人,但偶尔会作为嘉宾出现在其他播客中(例如“格鲁伯脱口秀”或“科技周刊”)。

到目前为止,我的数据模型如下所示(关注主持人/嘉宾剧集/节目关系)。我不确定如何处理 Person/Guest/Host 建模,但我确定我想将“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 :through 并且不确定使用哪个,如果有的话。

更新#1

在睡了这个之后,我对如何在早上处理它有了一些更好的想法。与下面@Emm 的回复类似,“Host”和“Guest”应该只是通过单独模型的 Person 的某种品质,这似乎很自然。这是我对模型结构的新思考,我在看到下面的任何响应之前设置了它。

这里的关键区别在于“外观”模型将有一个“角色”列(字符串),我可以在其中设置与该行关联的 person_id 是该行的 episode_id 或 show_id 的“guest”还是“host”。

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

你只是在谈论两种不同的模型,所以我会保持简单。让我们把People, Host, 和组合GuestPerson; 让我们将EpisodeShow合并为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

并存储在varietyRole之间的关系类型PersonPodcast。这可能是一个类似"host"or的字符串"guest",或者您甚至可以创建另一个模型来调用Variety它来管理它(因此存储variety_id而不是varietyin Role)。

于 2013-03-22T04:04:47.960 回答
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

更好的选择是不将 Host 和 guest 分开,Guest 可以使用 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 回答