Tim*_*lin 4 ruby activerecord ruby-on-rails ruby-on-rails-3.2 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
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用此查询获取特定订单:
admins = Admin.where(...).includes(:orders).where('orders.operation = ?', 'new gifts!')
Run Code Online (Sandbox Code Playgroud)
这与预期一样有效.但是当我尝试使用这样的地图制作json时
admins.map {|a| [a.name, a.orders.pluck(:operation)]}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
当我尝试使用循环而不是map时,它的工作原理应该是:
admins.each do |a|
p a.orders.pluck(:operation)
end
Run Code Online (Sandbox Code Playgroud)
此代码不会加载所有订单,只打印第一个查询中加载的订单.是否可以使用地图获得相同的结果?使用循环代替map有什么缺点?
pluck应始终对数据库进行新查询.不确定为什么你认为它不会在each循环中发生.也许你没有看到日志,因为它介于你的版画之间?
如何避免其他查询有两种可能性.
由于您已经加载了订单,因此您可以这样做 admins.map {|a| [a.name, a.orders.collect(&:operation)]}
使用连接(参见@ tihom的评论).
编辑:我刚刚测试了each/ mapbehavior并且每次都按预期重新加载.
| 归档时间: |
|
| 查看次数: |
5318 次 |
| 最近记录: |