我可以将此rails计算推送到数据库中吗?

时间:2012-01-07 06:48:36

标签: ruby-on-rails-3 active-record-query

我正在尝试通过在数据库中而不是在应用层中工作来提高应用的效率,我想知道是否可以将此计算移动到数据库中。

型号:

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类中有一个价格方法:

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

我怀疑有可能进行Offer.sum计算而不是直接从数据库获得答案而不是循环记录,但Calculations section of the ActiveRecord query guide没有足够的细节来帮助我出去任何人

谢谢!

2 个答案:

答案 0 :(得分: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>
;

答案 1 :(得分: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
;