2012-10-25 53 views
1

我有以下型号:Active Record的关系有许多通过

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匹配的电影的活动记录关系对象?

UPDATE

我有两个解决方案的工作( “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) 
+0

可以”你只需加入favorite_director_set.fk_director = movie.fk_director中最喜欢的导演设置? – mkk

+0

@mkk。谢谢。我认为这很有道理,但恐怕你需要为我拼出来。即你会说Movie.joins(:什么?)... –

回答

3

一种方式是说FDS = FavoriteDirectorSet.find(fds_id)

Movie.where( 'DIRECTOR_ID IN()?',fds.derectors.map(&:ID))

:或加入(这个不知道)

Movie.joins(:导演=> [:链接=>:favorite_director_sets])。其中( “?favorite_director_sets.id =”,fds_id)

+0

谢谢。有这两个工作。必须对第二个进行调整:[:links =>:favorite_director_set](即“sets”不是复数)。非常感激。 –

0

您可以使用JOIN根据RubyGuides

语法我用的是:

@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意味着什么是替代品。

UPDATE:

请注意,其他的解决办法要简单得多,但可能表现更差明智:

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

,或者你甚至可以把它写在一行:

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

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

+0

谢谢你。我无法得到这个解决方案的工作,但我想知道如果我失去了一些东西。它确实导致了更少的SQL,因此如果我缺少更快的选项,我很感兴趣。我编辑了我的问题。 –

+0

@Derek对不起,我误解了这个问题 - 我忘了链接表。我相信你应该坚持Rubyman的解决方案。 – mkk

+0

没问题。你让我想到虽然;-) –