微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – ActiveRecord:包括 – 如何使用已加载关联的地图?

我有一个小型rails应用程序,我正在尝试获取一些订单统计信息.
所以我有一个Admin模型和一个Order模型,具有一对多的关联.

class Admin < ActiveRecord::Base
  attr_accessible :name
  has_many :orders
class Order < ActiveRecord::Base
  attr_accessible :operation
  belongs_to :admin

我正在尝试使用此查询获取特定订单:

admins = Admin.where(...).includes(:orders).where('orders.operation = ?','new gifts!')

这与预期一样有效.但是当我尝试使用这样的地图制作json时

admins.map {|a| [a.name,a.orders.pluck(:operation)]}

Rails使用新查询再次加载订单,忽略已加载的对象.

(5.6ms)  SELECT "orders"."operation" FROM "orders" WHERE "orders"."admin_id" = 26
(6.8ms)  SELECT "orders"."operation" FROM "orders" WHERE "orders"."admin_id" = 24
(2.9ms)  SELECT "orders"."operation" FROM "orders" WHERE "orders"."admin_id" = 30
(3.3ms)  SELECT "orders"."operation" FROM "orders" WHERE "orders"."admin_id" = 29
(4.8ms)  SELECT "orders"."operation" FROM "orders" WHERE "orders"."admin_id" = 27
(3.3ms)  SELECT "orders"."operation" FROM "orders" WHERE "orders"."admin_id" = 28
(5.1ms)  SELECT "orders"."operation" FROM "orders" WHERE "orders"."admin_id" = 25

当我尝试使用时
循环而不是map,它按原样运行:

admins.each do |a|
  p a.orders.pluck(:operation)
end

代码不会加载所有订单,只打印第一个查询中加载的订单.
是否可以使用地图获得相同的结果?使用循环代替map有什么缺点?

解决方法

pluck应该总是对数据库进行新的查询.不确定为什么你认为它不会在每个循环中发生.也许你没有看到日志,因为它介于你的版画之间?

如何避免其他查询有两种可能性.

>由于您已经加载了订单,因此您可以执行admins.map {| a | [a.name,a.orders.collect(&:operation)]}
>使用连接(参见@ tihom的评论).

编辑:我刚刚测试了每个/ map行为,并且每次都按预期重新加载.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐