【发布时间】:2014-03-14 05:37:31
【问题描述】:
在我的场景中,我有一个 BlogPost 模型 has_and_belongs_to_many :categories。我想过滤 out 属于特定类别的博客文章,同时仍然允许未分类的博客文章(因此需要 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, 2, 3)")
是否有一种 ActiveRecord 友好的方式可以将条件添加到 LEFT OUTER JOIN 的 ON 子句,而无需像我那样手动输入?
【问题讨论】:
-
如果您想过滤掉博客文章,为什么要使用 LEFT JOIN 或
includes?为什么不是标准的 JOIN (joins)? -
@PinnyM 一个标准的 JOIN 对我不起作用,因为我需要查询返回可能没有任何类别标记的博客帖子
-
@ncherro 一旦您提及关联的主键和外键,它将自动使用。
标签: sql ruby-on-rails activerecord join rails-activerecord