我正在尝试通过在数据库中而不是在应用层中工作来提高应用的效率,我想知道是否可以将此计算移动到数据库中。
型号:
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没有足够的细节来帮助我出去任何人
谢谢!
答案 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
;