ruby 在 rails 很多很多
ruby on rails manys' many
我想知道如何在每个循环不加倍的情况下做到这一点。
假设我有一个用户模型和订单模型,用户has_many个订单。
现在我有一个用户数组,class 是 User::ActiveRecord_Relation
如何在一行中获取这些用户的订单?
一问就想到答案....
users.map {|user| user.orders}
实际上,最好的方法是:
users.includes(:orders).map(&:orders)
因为您急切地加载了用户的订单(只有 2 sql 个查询)
或
Order.where(user_id: users.pluck(:id))
性能方面也不错
如果您有一个多对多关联并且您需要快速加载所有关联的订单,您需要小心避免所谓的 "N plus 1" 加载最明显的方法:
orders = users.collect(&:orders).flatten
这将遍历每个用户和 运行 类似 SELECT * FROM orders WHERE user_id=?
的查询而不进行任何分组。
你真正想要的是:
orders = Order.where(user_id: users.collect(&:id))
这应该可以在单个查询中找到所有用户的所有订单。
我想知道如何在每个循环不加倍的情况下做到这一点。 假设我有一个用户模型和订单模型,用户has_many个订单。
现在我有一个用户数组,class 是 User::ActiveRecord_Relation
如何在一行中获取这些用户的订单?
一问就想到答案....
users.map {|user| user.orders}
实际上,最好的方法是:
users.includes(:orders).map(&:orders)
因为您急切地加载了用户的订单(只有 2 sql 个查询)
或
Order.where(user_id: users.pluck(:id))
性能方面也不错
如果您有一个多对多关联并且您需要快速加载所有关联的订单,您需要小心避免所谓的 "N plus 1" 加载最明显的方法:
orders = users.collect(&:orders).flatten
这将遍历每个用户和 运行 类似 SELECT * FROM orders WHERE user_id=?
的查询而不进行任何分组。
你真正想要的是:
orders = Order.where(user_id: users.collect(&:id))
这应该可以在单个查询中找到所有用户的所有订单。