0

Я создаю приложение, которое будет каталогом для подкастов/радиопередач (в основном, для показаний каждого шоу). Я зациклился на том, как моделировать людей в этом приложении, главным образом потому, что человек может быть и гостем на многих разных эпизодах (на многих разных шоу), но также может быть хозяином (кто-то, кто показан на каждом эпизоде данного шоу).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 

ответ

0

Вы говорите только о двух разных моделях, поэтому я бы сохранил это просто. Давайте объединим People, Host и Guest в Person; и давайте объединим 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 в Role тип отношений между Person и Podcast. Это может быть строка типа "host" или "guest", или вы можете сделать еще одну модель под названием Variety, чтобы управлять ею (и таким образом сохраняя variety_id вместо variety в Role).

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 
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