1

我有以下型号:

class FavoriteDirectorSet < ActiveRecord::Base
  has_many :links
  has_many :directors, through: :links
end

class Link < ActiveRecord::Base
  belongs_to :favorite_director_set
  belongs_to :director
end

class Director < ActiveRecord::Base
  has_many :links
  has_many :favorite_director_sets, through: :links
  has_many :movies
end

class Movie < ActiveRecord::Base
  belongs_to :director
end

我一直在通过将范围链接在一起来构建查询,但我不清楚如何分解这个。如何创建与给定的 FavoriteDirectorSet id 匹配的电影的 Active Record Relation 对象?

更新

我有两个有效的解决方案(“favourite_director”缩写为 fd):

1)@rubyman 选项 1:

fd_sets = FDSet.find(:fd_set_id)
res = Movie.where('director_id IN (?)', fd_sets.directors.map(&:id))

2)@rubyman 选项 2:

res = Movie.joins(:director=>[:links=>:fd_set]).
    where("fd_sets.id = ?", :fd_set_id)
4

2 回答 2

3

一种方法是 fds = FavoriteDirectorSet.find(fds_id)

Movie.where('director_id IN (?)', fds.deectors.map(&:id))

或加入(不确定)

Movie.joins(:director=>[:links=>:favorite_director_sets]).where("favorite_director_sets.id = ?", fds_id)

于 2012-10-25T07:56:41.363 回答
0

您可以根据RubyGuides使用 JOIN

我会使用的语法是:

@movie.joins("INNER JOIN favorite_director_sets ON favorite_director_sets.fk_director = movies.fk_director") # please ensure that table names are correct - if they follow convention, I believe they are correct

现在您可以添加 where 条件,即favorite_director_sets.id = ?, fds_id

请注意,在您的情况下,您可能想要使用 LINNER 以外的其他东西。在CoddingHorror上有很好的视觉解释 INNER JOIN 的含义以及替代方案。

更新:

请注意,其他解决方案要简单得多,但性能可能更差:

fds = FavoriteDirectorSet.find(fds_id)
@movies = fds.director.movies

或者您甚至可以将其写在一行中:

@movies = FavoriteDirectorSet.find(fds_id).director.movies

更新:这个答案是错误的,因为我忘记了链接表。Rubyman 的解决方案看起来不错

于 2012-10-25T07:48:11.830 回答