ActiveRecord ::使用预先加载的计算会进行多个数据库查询吗?

时间:2013-10-19 04:40:11

标签: ruby-on-rails ruby activerecord eager-loading

我的困惑来自this question,其中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或其他此类方法,我是否每次都会访问我的数据库?

1 个答案:

答案 0 :(得分:4)

ActiveRecord::Calculations(包括sumcountaverage)即使项目已加载,也会点击数据库。例如,

 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)登录控制台。然后,您可以查看为每种方法进行的数据库查询。