3

我的困惑源于这个问题,其中 OP 有一个类似的模型

class Quote < ActiveRecord::Base
  has_many :items
  def calc_price
    sum = 0
    #logic for summation
  end
end

在答案中,有几个人建议直接使用 sum 方法来计算属性的总和

def total_price
  items.sum('price')
end

如果我渴望使用 加载数据Quote.includes(:items).find(:all),总和是否发生在数据库的末尾,还是使用已加载到内存中的对象?如果它使用已加载到内存中的对象,则计算不会被卸载到数据库。

是否会进行两次数据库查询,一次是预加载,一次是汇总价格?

将相同的逻辑扩展到所有ActiveRecord::Calculations,如果我执行一个或其他此类方法,我会每次都访问我的数据库countaverage

4

1 回答 1

4

ActiveRecord::Calculations(包括sum, count, average)即使项目是预先加载的,也会访问数据库。例如

 quotes = Quote.includes(:items).find(:all)
 # two queries one to fetch quotes and one to fetch all associated items

 items = quotes.first.items
 # no query as items are eager loaded

 total_price = quotes.first.items.sum(:price)
 # one query to get sum of item prices for the first quote
 # summation is done by the database

要检查这一点,请运行 rails 控制台并使用ActiveRecord::Base.logger = Logger.new(STDOUT). 然后,您可以查看针对每种方法进行了哪些数据库查询。

于 2013-10-19T04:55:37.823 回答