4

私は小さな Rails アプリを持っており、注文統計を取得しようとしています。したがって、1 対多の関連付けを持つ 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

このコードはすべての注文をロードするわけではなく、最初のクエリでロードされた注文のみを出力します。マップを使用して同じ結果を得ることができますか? マップの代わりにループを使用することの欠点は何ですか?

4

1 に答える 1