ActiveRecord ::带有急切加载的计算会进行多个数据库查询吗?

我的困惑源于这个问题 ,其中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或其他此类方法,我是否每次都会访问我的数据库?

即使项目是急切加载的, 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)登录到控制台。 然后,您可以查看为每个方法进行的数据库查询。