我的困惑来自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,如果我执行count
或average
或其他此类方法,我是否每次都会访问我的数据库?
答案 0 :(得分: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)
登录控制台。然后,您可以查看为每种方法进行的数据库查询。