在我的场景中,我有一个BlogPost模型,其中包含has_and_belongs_to_many:categories.我想过滤掉属于特定类别的博客帖子,同时仍然允许未分类的博客帖子(因此需要LEFT OUTER JOIN).
我希望这可行:
BlogPost.active.includes(:categories).where.not(categories: { id: [1,2,3] })
但它没有正确过滤,因为它将条件放在查询的末尾,在LEFT OUTER JOIN之外(请参阅此SO问题/答案,原因是:SQL join: where clause vs. on clause)
这有效,但很难看:
BlogPost.active.joins("LEFT OUTER JOIN blog_posts_categories ON blog_posts_categories.blog_post_id = blog_posts.id AND blog_posts_categories.category_id NOT IN(1,3)")
是否有一种ActiveRecord友好的方式来添加条件到LEFT OUTER JOIN的ON子句而不用我的方式手动输入它?