4

假设我有两个简单的模型

project
   t.string :title

vote
   t.references :project
   t.integer :value

当我遍历所有项目时,我还想包括所有投票的总和,因为做

projects = Project.all

foreach project in projects
    sum = project.votes.sum(:value)
    ...

不是很有效。

有没有办法在不手动编写 SQL 的情况下做到这一点?就像是

SELECT p.*, SUM(v.value)
FROM projects p
LEFT JOIN votes v
ON v.project_id = p.id
GROUP BY p.id
4

1 回答 1

5

如果这被频繁计算,您最好在项目记录(total_votes)中保留汇总统计信息。您可以在每次投票时更新,也可以通过 cron 作业进行更新。

我认为您正在寻找以下内容:


@totals = Vote.sum(:value,:group=>:project_id)
@projects = Project.find(:all)

然后

<%=h @project.title %> has <%= @totals[@project.id] %> votes.

于 2009-08-28T16:44:12.187 回答