通过has_many关联检索多个记录

时间:2014-03-11 17:13:03

标签: ruby-on-rails postgresql activerecord

我正在开发一个Ruby on Rails 4应用程序,它允许用户查看他们看过的电影。我有一个页面,显示通过Film模型捕获的电影列表。此外,我有一个Nomination模型,可以获得每个奥斯卡提名以及PersonSong模型,这些模型也可以提名并属于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

1 个答案:

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