使用Rails3,我有一个downloads
表,download_date
和credits
列。我想生成一个表,如:ActiveRecord查询详细和汇总数据
Date Credits
2010-11-01 25
2010-11-01 27
*2010-11-01 52 <= Sum of previous 2 rows
2010-11-02 32
*2010-11-02 32 <= Sum of previous row
这可以使用类似来完成:
u.downloads.group_by(&:download_date).each do |date, downloads|
downloads.each do |d|
puts " %10s %3d" % [d.download_date, d.credits]
end
puts "*%10s %3d" % [date, downloads.sum(&:credits)]
end
此解决方案,同时它的工作原理,是不是太Rails的样,并导致相当发出大量的SQL查询。假设每100个用户x 10,000次下载/年,并且每年年底查询计数为每个这些页面的1,000,000次。
我想出的任何解决方案都应该是数据库不可知的,如果可能的话。我知道我将在Heroku上使用PostgreSQL进行部署,但是我的开发版本(无论如何被误导)仍然在MySQL上运行。
我希望我已经提供了有关问题域和涉及问题的足够信息。任何意见或建议?
我应该补充说优化是好的(谢谢法比奥!)但我特别寻找的两件事是Rails'ey的方式来做到这一点,不依赖Array#group_by,因为迭代内存一批AR对象只是为了分组,然后我必须重新访问它们以进行求和。可能没有这种优雅的方式 - 我只是认为这是一个常见的用例。始终在会计上出现。 – 2010-11-09 20:33:27