2010-09-24 6 views
1

Je dois faire des calculs sur ma base de données. Quand j'utilisais mysql, ce n'était pas un problème, mais maintenant que j'utilise PGSQL, je vois le problème suivant:Comment gérer un groupe automatiquement avec PGSQL?

J'ai 3 tables: chiens, utilisateurs et dogs_users, la table de jointure (c'est un nn, tous les chien peut avoir plusieurs utilisateurs et chaque utilisateur peut avoir plusieurs chiens)

Quand je fais ce qui suit:

ree-1.8.7-2010.02 > User.first.dogs.group(:name).average(:number_of_fleas) 

ActiveRecord::StatementInvalid: PGError: ERROR: column "dogs.id" must appear in the GROUP BY clause or be used in an aggregate function 
LINE 1: SELECT  "dogs".*, AVG("dogs"."number_of_fleas") AS "avera... 
       ^
: SELECT  "dogs".*, AVG("dogs"."number_of_fleas") AS "average_number_of_fleas", name AS name FROM  "dogs" INNER JOIN "dogs_users" ON "dogs".id = "dogs_users".dog_id WHERE  (("dogs_users".user_id = 1)) GROUP BY name 

le seul travail autour je l'ai trouvé pour gérer le problème était de faire ce qui suit:

Dog.where(:id => User.first.dogs.map(&:id)).group(:name).average(:number_of_fleas) 

Et ce n'est pas très lisible ni très optimisé ...

Nous vous remercions de votre aide!

Répondre

1

Vous pouvez utiliser distincte sur si vous ne faites pas lequel des multiples valeurs que vous obtenez en retour:

sélectionnez col1 distinct (col1, col2), col2, col3 de sometable;

Notez que vous pouvez obtenir n'importe quelle valeur pour col3 ici.

Questions connexes