2009-08-28 6 views
3

Disons que j'ai deux modèles simplesComment ne se joindre à SUM ActiveRecord

project 
    t.string :title 

vote 
    t.references :project 
    t.integer :value 

Quand je fais boucle throuh tous les projets, je veux aussi inclure la somme de tous les votes, car cela

projects = Project.all 

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

n'est pas vraiment efficace.

Existe-t-il un moyen de le faire sans écrire manuellement le SQL? Quelque chose comme

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

Répondre

5

Si cela se calcule souvent, vous êtes probablement mieux garder une statistique sommaire dans le dossier du projet (total_votes). Vous pouvez soit mettre à jour chaque vote, ou mettre à jour via un travail cron.

Je pense que vous êtes à la recherche de ce qui suit si:


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

puis

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

+0

en fait, je cherchais quelque chose comme dans la requête, voir modifier –

+0

Ma suggestion, vous recevrez un OrderedHash de project_id => sum, vous pouvez coupler cela avec un Project.find (: all) et assembler les données assez facilement. Je ne pense pas que les rails aient un support pour retourner quelque chose de si complexe sans utiliser de SQL brut – klochner

Questions connexes