0

我的 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
  • 为计数器使用单独的数据库比搜索和计数记录更好吗?
  • 你推荐/建议什么数据库结构?
4

3 回答 3

2

假设persons是一个 Activerecord 关系

persons.joins(:payments).sum(:value)

如果persons已经是一个数组(不太喜欢)

Payment.where(:person_id => persons.map(&:id)).sum(:value)

如果总付款是此视图中关联付款的唯一属性需求。那么最快的方法是在表中创建total_payments一个字段。person每当建立关联时更新它payment。类似于计数器缓存的东西。然后,您根本不需要为付款进行 sql 查询。

于 2013-09-23T04:06:56.243 回答
0

您可以尝试将 Payment.select('value') 之类的操作作为基本查询,以便您只执行一个查询并对其进行映射。

于 2013-09-23T03:37:42.983 回答
0

你能试试吗

@total_payments += p.payments.pluck(:value).sum

这只会value从每次付款中选择,而不是表中的所有字段。您的表格是否在表格中被person_id索引Payment?这也将有助于加速数据库。

(在移动自动取款机上,所以不能更深入地潜水)

于 2013-09-23T03:40:58.967 回答