加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – Rails包含()LEFT OUTER JOIN和自定义ON子句

发布时间:2020-12-12 06:36:06 所属栏目:MsSql教程 来源:网络整理
导读:在我的场景中,我有一个BlogPost模型,其中包含has_and_belongs_to_many:categories.我想过滤掉属于特定类别的博客帖子,同时仍然允许未分类的博客帖子(因此需要LEFT OUTER JOIN). 我希望这可行: BlogPost.active.includes(:categories).where.not(categories:
在我的场景中,我有一个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子句而不用我的方式手动输入它?

解决方法

我认为这可能有用.
BlogPost.active.joins(:categories).merge(Category.where.not(categories: { id: [1,3] })

并将其与范围一起添加,以获取所有没有类别的博客帖子.另一个想法是改为使用has_many through关系,并实际为BlogPostCategory创建一个模型,因为你可以在其上添加中间范围.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读