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 ,如果我进行count
或average
或其他此类方法,我是否每次都会访问我的数据库?
即使项目是急切加载的, 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)
登录到控制台。 然后,您可以查看为每个方法进行的数据库查询。