作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设这个简化的模式:users has_many discount_codes
discount_codes has_many orders
我要全部抢users
,如果他们碰巧有任何 orders
,仅包括在两个日期之间创建的订单。 但是如果他们没有订单,或者只有这两个日期之外的订单,仍然返回用户并且永远不排除任何用户。
我现在在做什么:
users = User.all.includes(discount_codes: :orders)
users = users.where("orders.created_at BETWEEN ? AND ?", date1, date2).
or(users.where(orders: { id: nil })
我相信我的 OR 子句允许我保留没有任何订单的用户,但是如果我的用户只有 date1 和 date2 之外的订单,那么我的查询将排除该用户。
where
在这里特别是条款,以便我可以在稍后确定每个用户的订单时避免 n + 1 问题。
最佳答案
尝试控制作为用户 where 子句一部分加载的订单是没有意义的。如果您要控制它必须是包含的一部分(我认为这意味着它必须是关联的一部分)。
尽管从技术上讲,在某些情况下它可以将它们合并为一个查询,但 activerecord 会将其作为两个查询来执行。
第一个查询将在您遍历用户时执行,并将使用该 where 子句来限制找到的用户。
然后它将根据包含语句在后台运行第二个查询。这将只是一个查询,用于获取与上一个查询找到的用户相关联的所有订单。因此,控制通过用户的 where 子句找到的订单的唯一方法是从结果集中省略用户。
如果我是你,我会在 User 模型中为你正在寻找的东西创建一个实例方法,而不是使用 where 使用 select 块:
def orders_in_timespan(start, end)
orders.select{ |o| o.between?(start, end) }
end
由于 ActiveRecord 将根据实例缓存从包含中找到的订单的方式,那么如果您从用户查询中的包含开始,那么我相信这不会导致 n 查询。
render json: User.includes(:orders), methods: :orders_in_timespan
当然,确认查询次数的最简单方法是查看日志。我相信这种方法应该有两个查询,而不管呈现的用户数量有多少(问题中的代码很可能也是如此)。
关于ruby-on-rails - Rails 5 ActiveRecord 可选包含嵌套关联的属性的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64703305/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!