2011-07-10 1 views
3

J'ai un Product et chaque produit a beaucoup de ratings. J'essaie de créer un :highest_rated gamme de produits qui commande les produits par leur note moyenne la plus élevée (chaque note est dans le tableau ratings). J'ai essayé ceci:: portée la plus élevée pour classer par classement moyen

scope :highest_rated, includes(:ratings).order('avg(ratings.rating) DESC') 

Mais cela m'a donné une erreur misuse of aggregate: avg().

Des conseils sur la façon de commander mes produits par leur note moyenne la plus élevée?

Répondre

5

Cela fonctionne:

scope :highest_rated, includes(:ratings).group('product_id').order('AVG(ratings.rating) DESC') 

Pour que les produits avec chercher une cote existante:

scope :highest_rated, includes(:ratings).group('product_id').where('ratings.rating IS NOT NULL').order('AVG(ratings.rating) DESC') 

EDIT: ci-dessus ne fonctionnera pas dans PostgreSQL. Je l'ai utilisé à la place (qui fonctionne à la fois dans SQLite et PostgreSQL):

scope :highest_rated, where("products.id in (select product_id from ratings)").group('products.id, products.name, products.all_other_fields').joins(:ratings).order('AVG(ratings.rating) DESC') 
Questions connexes