gpt4 book ai didi

sql - Rails include() 带有自定义 ON 子句的 LEFT OUTER JOIN

转载 作者:行者123 更新时间:2023-12-03 03:32:16 25 4
gpt4 key购买 nike

在我的场景中,我有一个 BlogPost 模型,它 has_and_belongs_to_many :categories。我想过滤掉属于特定类别的博客文章,同时仍然允许未分类的博客文章(因此需要 LEFT OUTER JOIN)。

我预计这会起作用:

BlogPost.active.includes(:categories).where.not(categories: { id: [1, 2, 3] })

但它无法正确过滤,因为它将条件放在查询末尾、LEFT OUTER JOIN 之外(原因请参阅此问题/答案: 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 子句中,而无需像我一样手动输入?

最佳答案

我认为这可能有效。

BlogPost.active.joins(:categories).merge(Category.where.not(categories: { id: [1,2,3] })

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

关于sql - Rails include() 带有自定义 ON 子句的 LEFT OUTER JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21786479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com