0

以下を考えると:

class Item < ActiveRecord::Base
  has_many :order_items
  has_many :orders, through: :order_items

  attr_accessible :rent_price, :sale_price
end

class Order < ActiveRecord::Base
  has_many :order_items, dependent: :destroy

  def total
    order_items.map(&:price).reduce(:+)
  end
end

class OrderItem < ActiveRecord::Base
  belongs_to :item
  belongs_to :order

  attr_accessible :type, :quantity

  def item_price
    item.send("#{type}_price")
  end

  def price
    quantity * item_price
  end
end

Order#order_items および Order#total は、SQL クエリを生成します。

irb(メイン):055:0> o = Order.last
  Order Load (0.4ms) SELECT "orders".* FROM "orders" ORDER BY "orders"."id" DESC LIMIT 1
=> #, 残高: #, メモ: nil, shipping_method: nil, shipping_details: nil, created_at: "2012-09-16 17:27:39", updated_at: "2012-09-16 21:09:56">

irb(メイン):056:0> oi = o.order_items.includes(アイテム: :写真)
  OrderItem Load (0.4ms) SELECT "order_items".* FROM "order_items" WHERE "order_items"."order_id" = 143
  Item Load (0.2ms) SELECT "items".* FROM "items" WHERE "items"."id" IN (227)
  写真の読み込み (0.1ms) SELECT "photos".* FROM "photos" WHERE "photos"."item_id" IN (227)
=> [#、数量: 1、サイズ: 95、タイプ: "家賃"、starts_on: "2012-09-17"、ends_on: "2012-09-18"、created_at: "2012-09-16 20:03 :33", updated_at: "2012-09-16 21:09:56">]

irb (メイン):057:0> o.order_items
  OrderItem Load (0.4ms) SELECT "order_items".* FROM "order_items" WHERE "order_items"."order_id" = 143
=> [#、数量: 1、サイズ: 95、タイプ: "家賃"、starts_on: "2012-09-17"、ends_on: "2012-09-18"、created_at: "2012-09-16 20:03 :33", updated_at: "2012-09-16 21:09:56">]

irb (メイン):058:0> o.total
  Item Load (0.4ms) SELECT "items".* FROM "items" WHERE "items"."id" = 227 LIMIT 1
=> #

冗長な SQL クエリを取り除くにはどうすればよいですか?

4

1 に答える 1

0

oi = o.order_items.includes(item: :photos)o.order_items を変更せず、インクルードを追加します。追加のオプションが適用されたオブジェクトの新しい配列を返します。

o.order_items を使用o = Order.includes(order_items: {item: photos}).lastすると、クエリは実行されません

于 2012-09-17T14:19:52.667 に答える