我在使用rails应用程序时遇到了问题。这可能是数据库结构不佳的结果。考虑到记录是5k +,该页面经常被用户查看。
Current System:
Model:
person has_many payment
Controller:
@total_payments = 0
person.each do |p|
@total_payments += p.payments.map(&:value).sum
end
View:
@total_payments
答案 0 :(得分:2)
假设persons
是Activerecord关系
persons.joins(:payments).sum(:value)
如果persons
已经是一个数组(不太喜欢)
Payment.where(:person_id => persons.map(&:id)).sum(:value)
如果在此视图中,总付款是相关付款的唯一属性。然后,最快的方法是在total_payments
表中使person
成为一个字段。每当建立关联的payment
时更新它。类似于计数器缓存的东西。然后你根本不需要为付款进行SQL查询。
答案 1 :(得分:0)
您可以尝试使用Payment.select('value')之类的内容作为基本查询,这样您只需执行一次查询并在其上进行映射。
答案 2 :(得分:0)
你能试试吗
@total_payments += p.payments.pluck(:value).sum
这只会从每笔付款中选择value
,而不是从表格中选择所有字段。您的表是否在person_id
表中的Payment
上编入索引?这也有助于加快数据库的速度。
(在移动设备上,因此无法深入了解)