我想知道如何在没有双循环的情况下执行此操作。 假设我有一个用户模型和订单模型,以及用户has_many订单。
现在我有一个用户数组,其类是User :: ActiveRecord_Relation
如何在一行中获取这些用户的订单?
答案 0 :(得分:2)
实际上,最好的方法是:
users.includes(:orders).map(&:orders)
因为你急于加载用户的订单(只有2个sql查询)
或
Order.where(user_id: users.pluck(:id))
在表现方面也非常好
答案 1 :(得分:1)
如果您有多对多关联并且需要快速加载所有相关订单,则需要小心避免所谓的“N加1”加载明显的做法:
orders = users.collect(&:orders).flatten
这将迭代每个用户并运行SELECT * FROM orders WHERE user_id=?
之类的查询而不进行任何分组。
你真正想要的是:
orders = Order.where(user_id: users.collect(&:id))
这应该可以在一个查询中找到所有用户的所有订单。
答案 2 :(得分:0)
在我问完后,我的想法就出现了......
users.map {|user| user.orders}