【发布时间】:2010-11-09 19:40:22
【问题描述】:
使用 Rails3,我有一个 downloads 表,其中包含 download_date 和 credits 列。我要生成的是这样的表:
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 上运行。
我希望我已经提供了有关问题域和所涉及问题的足够信息。有什么意见或建议吗?
【问题讨论】:
-
我应该补充一点,优化很好(感谢 Fabio!)但我正在寻找的两件事是非常 Rails'ey 的方式来做到这一点,它不依赖于 Array#group_by,因为迭代内存中的一批 AR 对象只是为了分组,然后我必须重新访问它们进行求和。可能没有这样优雅的方式——我只是认为这是一个常见的用例。一直出现在会计领域。
标签: sql ruby-on-rails activerecord