【问题标题】:How to do join with SUM in ActiveRecord如何在 ActiveRecord 中加入 SUM
【发布时间】:2010-11-23 18:36:53
【问题描述】:

假设我有两个简单的模型

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    那么

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

    【讨论】:

    • 实际上,我在查询中寻找类似的东西,请参阅编辑
    • 我的建议将返回 project_id=>sum 的 OrderedHash,您可以将它与 Project.find(:all) 结合起来,并很容易地组装数据。我不认为 rails 支持在不使用原始 SQL 的情况下返回复杂的东西
    猜你喜欢
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2022-01-13
    相关资源
    最近更新 更多