2009-08-28 4 views
3

Скажем, у меня есть две простые моделиКак сделать присоединиться SUM в ActiveRecord

project 
    t.string :title 

vote 
    t.references :project 
    t.integer :value 

Когда я делаю петлю throuh всех проектов, я также хочу, чтобы включать в себя сумму всех голосов, потому что делать

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 

ответ

5

Если это получает вычислено часто, вы, вероятно, лучше держать сводную статистику в записи проекта (total_votes). Вы можете обновлять данные о каждом голосовании или обновлять его с помощью задания cron.

Я думаю, что вы ищете следующий хотя:


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

затем

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

+0

на самом деле, я искал что-то подобное в запросе см редактировать –

+0

Мое предложение будет возвращать OrderedHash из project_id => sum, вы можете связать это с Project.find (: all) и собрать данные довольно легко. Я не думаю, что у рельсов есть поддержка для возвращения чего-то такого сложного без использования raw SQL – klochner

Смежные вопросы