1

Rails のビデオとキャンペーンの間に HABTM 関係があります。これは、関連付けが結合テーブルに格納されていることを意味します。キャンペーンが関連付けられていないすべての動画を検索したいと考えています。これを行う最も効率的な方法は何でしょうか?

ご覧いただきありがとうございます =)

4

3 に答える 3

3
Video.all(:include => :campaigns, :conditions => ["campaigns.id IS ?", nil])

これ:includeは、関連付けられたテーブルへの左結合を行うため、キャンペーンのないものはすべてNULL、キャンペーン フィールド値の値を持つ必要があります。

于 2010-07-14T04:29:38.213 に答える
1

Ruby の方法:

Video.all.select {|v| v.campaigns.empty?}

メソッドでスタンドアロンで使用すると、よりエレガントになると思います。ただし、そのために名前付きスコープを作成することをお勧めします。繰り返しますが、ジェフのバージョンが正しいものです。

named_scope :campaign_less, :include => :campaigns, :conditions => ["campaigns.id IS ?", nil]

その上、ジェフのソリューションは、より低レベルであるため、おそらくより効率的です。

于 2010-07-14T08:05:37.157 に答える
0

SQL の方法:

Videos.select_by_sql("SELECT * FROM videos WHERE id NOT IN (SELECT video_id FROM campaign_videos)")
于 2010-07-14T04:30:24.983 に答える