我正在开发一个Ruby on Rails 4应用程序,它允许用户查看他们看过的电影。我有一个页面,显示通过Film
模型捕获的电影列表。此外,我有一个Nomination
模型,可以获得每个奥斯卡提名以及Person
和Song
模型,这些模型也可以提名并属于Film
。
在列出电影的页面上,我还想展示一部电影被提名的所有类别。我知道我可以通过@film.nominations
简单地访问所有电影提名,因为我创建了这个has_many关联,但这并不能捕获属于该特定电影的任何人或歌曲提名。
有没有办法显示给定电影的所有提名,无论提名是针对电影,人物还是歌曲?
以下是我目前拥有的模型:
class Category < ActiveRecord::Base
# DB columns: name, display_order
has_many :nominations
end
class Nomination < ActiveRecord::Base
# DB columns: category_id, nominee_id, nominee_type
belongs_to :category
belongs_to :nominee, polymorphic: true
validates :category, presence: true
validates :nominee, presence: true
end
class Film < ActiveRecord::Base
# DB columns: name, image_url
has_many :nominations, as: :nominee
has_many :film_views
has_many :people
has_many :songs
end
class Person < ActiveRecord::Base
# DB columns: name, film_id
belongs_to :film
has_many :nominations, as: :nominee
end
class Song < ActiveRecord::Base
# DB columns: name, film_id
belongs_to :film
has_many :nominations, as: :nominee
end
答案 0 :(得分:1)
因为在任何情况下,任何人或歌曲的提名都与电影有关。 提名应该有电影ID是有意义的;有了这个你的问题已经解决了。 NB的一个主要原因是因为一个人应该属于一部或多部电影。
<强>反正强> 如果你想获得一部电影的所有提名,你可以使用这个代码
def all_nominations
Nominations.where(nominee_type: 'Person', nominee_id: self.people.map(&:id)).or(nominee_type: 'Song', nominee_id: self.songs.map(&:id)).or(nominee_type: 'Film', nominee_id: self.id)
end