gpt4 book ai didi

sql - 使用 LEFT OUTER JOIN 来无条件地渴望加载关联?

转载 作者:太空宇宙 更新时间:2023-11-03 16:05:56 34 4
gpt4 key购买 nike

我们有一个带有 has_one 关联设置的模型:

class User
has_one :shirt

class Shirt
belongs_to :user

目前我们可以在检索有限的用户数组时添加 .includes(:shirt),它将按预期执行两个 SQL 查询。

我们的问题是加载页面的查询是这样做的:

SELECT "shirt".* FROM "shirts" WHERE "shirt"."user_id" IN (2147521, 2147522 ... )

例如,当检索 50 个用户和衬衫时,这对我们来说性能不是很好。我们的用户和衬衫表很大。我们注意到通过强制 Rails 使用 INNER JOIN 而不是通过执行以下操作可以大大提高速度:

User.where( ... ).joins(:shirts).includes(:shirts).limit(50)

不幸的是,这只会返回有衬衫的用户。我们需要能够返回一组有限的用户,无论他们是否有关联的衬衫。

有没有办法强制 Rails 使用 LEFT OUTER JOIN 而不是默认的双查询方法来预先加载关联的对象?

编辑

通过添加一个 where 子句,无论关联对象上的值是否为空,该子句都会返回 true。如果没有关联对象,它似乎并不介意,至少在 Postgres 上是这样。

User.where( ... ).includes(:shirt).where("shirts.created_at IS NULL OR shirts.created_at IS NOT NULL")

这解决了问题,但它并不理想,难道没有办法使用 LEFT OUTER JOIN 代替默认的两次查询方法吗?

最佳答案

this post 中所述,在大多数情况下,2 查询方法被认为更快(尽管对于您所拥有的一对一关系而言不一定如此)。如果你想强制 Rails 使用 LEFT OUTER JOIN,你可以通过在关联表上添加一个无意义的过滤器来实现:

User.where( ... ).
includes(:shirts).
where("shirts.id IS NULL OR shirts.id = shirts.id").
limit(50)

关于sql - 使用 LEFT OUTER JOIN 来无条件地渴望加载关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13915412/

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