Как сделать соединение с SUM в ActiveRecord - PullRequest
3 голосов
/ 28 августа 2009

Допустим, у меня есть две простые модели

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 Ответ

5 голосов
/ 28 августа 2009

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

Я думаю, вы ищете следующее:


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

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

...