ruby-on-rails – ActiveRecord:包括 – 如何使用已加载关联的
发布时间:2020-12-17 01:30:45 所属栏目:百科 来源:网络整理
导读:我有一个小型rails应用程序,我正在尝试获取一些订单统计信息. 所以我有一个Admin模型和一个Order模型,具有一对多的关联. class Admin ActiveRecord::Base attr_accessible :name has_many :ordersclass Order ActiveRecord::Base attr_accessible :operation
我有一个小型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 当我尝试使用时 admins.each do |a| p a.orders.pluck(:operation) end 此代码不会加载所有订单,只打印第一个查询中加载的订单. 解决方法
pluck应该总是对数据库进行新的查询.不确定为什么你认为它不会在每个循环中发生.也许你没有看到日志,因为它介于你的版画之间?
如何避免其他查询有两种可能性. >由于您已经加载了订单,因此您可以执行admins.map {| a | [a.name,a.orders.collect(&:operation)]} 编辑:我刚刚测试了每个/ map行为,并且每次都按预期重新加载. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |