3

アプリ層ではなくデータベースで作業を行うことでアプリの効率を上げようとしていますが、この計算をデータベースに移動できるかどうか疑問に思っています。

モデル:

class Offer < ActiveRecord::Base
  has_many :lines
  has_many :items, :through => :lines
end

class Line < ActiveRecord::Base
  belongs_to :offer
  belongs_to :item
  # also has a 'quantity' attribute (integer)
end

class Item < ActiveRecord::Base
  has_many :lines
  has_many :offers, :through => :lines
  # also has a 'price' attribute (decimal)
end

私がやりたいことは、オファーの価格を計算することです。現在、Offer クラスに price メソッドがあります。

def price
  self.lines.inject(0) do |total, line|
    total + line.quantity * line.item.price
  end
end

Offer.sumレコードをループするのではなく、DB から直接回答を取得する代わりに計算を行うことができるのではないかと思いますが、ActiveRecord クエリ ガイドの計算セクションには、私を助けるのに十分な詳細がありません。誰か?

ありがとう!

4

2 に答える 2

3

でこれを行うことができるのは正しいですsum。このようなもの:

class Offer < ActiveRecord::Base
  # ...

  def price
    self.lines.sum 'lines.quantity * items.price', :joins => :item
  end
end

たとえば、上記を呼び出すとOffer.find( some_id ).price、次のようなクエリが作成されます。

SELECT SUM( lines.quantity * items.price ) AS total
  FROM lines
  INNER JOIN items ON items.id = lines.item_id
  WHERE lines.offer_id = <some_id>
;
于 2012-01-07T07:17:42.330 に答える
2

場合によっては、SQL を使用したほうがよい場合もあります。

SELECT SUM( lines.quantity * items.price ) AS total
  FROM offers
  INNER JOIN lines ON offers.id = lines.offer_id
  INNER JOIN items ON items.id = lines.item_id
  WHERE offers.id = 1
;
于 2012-01-07T06:58:44.897 に答える