我在Rails中的视频和广告系列之间有HABTM关系,这意味着关联存储在连接表中。我想找到所有没有相关广告系列的视频。这样做最有效的方法是什么?
感谢您寻找=)
答案 0 :(得分:3)
Video.all(:include => :campaigns, :conditions => ["campaigns.id IS ?", nil])
:include
会对关联表格进行左联接,因此没有广告系列的任何内容都应该包含广告系列字段值的NULL
值。
答案 1 :(得分:1)
Ruby方式:
Video.all.select {|v| v.campaigns.empty?}
如果您在方法中单独使用它,我认为这更优雅。但是,我建议为此写一个named scope。然后,Geoffs版本是正确的版本:
named_scope :campaign_less, :include => :campaigns, :conditions => ["campaigns.id IS ?", nil]
此外,Geoffs解决方案可能更高效,因为它更低级。
答案 2 :(得分:0)
SQL方式:
Videos.select_by_sql("SELECT * FROM videos WHERE id NOT IN (SELECT video_id FROM campaign_videos)")