我在 Rails 中的视频和活动之间有 HABTM 关系,这意味着该关联存储在连接表中。我想找到所有没有相关活动的视频。这样做最有效的方法是什么?
谢谢你看=)
我在 Rails 中的视频和活动之间有 HABTM 关系,这意味着该关联存储在连接表中。我想找到所有没有相关活动的视频。这样做最有效的方法是什么?
谢谢你看=)
Video.all(:include => :campaigns, :conditions => ["campaigns.id IS ?", nil])
将对:include
关联表进行左连接,因此没有活动的任何内容都应该具有NULL
活动字段值的值。
红宝石方式:
Video.all.select {|v| v.campaigns.empty?}
我认为如果您在方法中独立使用它会更优雅。但是,我建议为此编写一个命名范围。再说一次,Geoffs 版本是正确的:
named_scope :campaign_less, :include => :campaigns, :conditions => ["campaigns.id IS ?", nil]
此外,Geoffs 解决方案可能更有效,因为它更底层。
SQL方式:
Videos.select_by_sql("SELECT * FROM videos WHERE id NOT IN (SELECT video_id FROM campaign_videos)")