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

スコープをチェーン化してクエリを作成するようになりましたが、これをどのように分解するかがわかりません。特定のFavoriteDirectorSetIDに一致するMoviesのActiveRecordRelationオブジェクトを作成するにはどうすればよいですか?

アップデート

2つのソリューションが機能しています(「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

1つの方法は、fds = FavoriteDirectorSet.find(fds_id)と言うことです。

Movie.where('director_id IN(?)'、fds.derectors.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

または、1行で書くこともできます。

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

更新:リンクテーブルを忘れたので、この答えは間違っています。Rubymanのソリューションは問題ないようです

于 2012-10-25T07:48:11.830 に答える