如何在ActiveRecord中与SUM连接

时间:2009-08-28 15:13:38

标签: ruby-on-rails database activerecord join aggregate

假设我有两个简单的模型

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

1 个答案:

答案 0 :(得分:5)

如果频繁计算,你可能最好在项目记录中保留摘要统计(total_votes)。您可以更新每次投票,也可以通过cron作业进行更新。

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


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

然后

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