Rails のビデオとキャンペーンの間に HABTM 関係があります。これは、関連付けが結合テーブルに格納されていることを意味します。キャンペーンが関連付けられていないすべての動画を検索したいと考えています。これを行う最も効率的な方法は何でしょうか?
ご覧いただきありがとうございます =)
Rails のビデオとキャンペーンの間に HABTM 関係があります。これは、関連付けが結合テーブルに格納されていることを意味します。キャンペーンが関連付けられていないすべての動画を検索したいと考えています。これを行う最も効率的な方法は何でしょうか?
ご覧いただきありがとうございます =)
Video.all(:include => :campaigns, :conditions => ["campaigns.id IS ?", nil])
これ:include
は、関連付けられたテーブルへの左結合を行うため、キャンペーンのないものはすべてNULL
、キャンペーン フィールド値の値を持つ必要があります。
Ruby の方法:
Video.all.select {|v| v.campaigns.empty?}
メソッドでスタンドアロンで使用すると、よりエレガントになると思います。ただし、そのために名前付きスコープを作成することをお勧めします。繰り返しますが、ジェフのバージョンが正しいものです。
named_scope :campaign_less, :include => :campaigns, :conditions => ["campaigns.id IS ?", nil]
その上、ジェフのソリューションは、より低レベルであるため、おそらくより効率的です。
SQL の方法:
Videos.select_by_sql("SELECT * FROM videos WHERE id NOT IN (SELECT video_id FROM campaign_videos)")