: самый высокий рейтинг для заказа по среднему рейтингу - PullRequest
3 голосов
/ 10 июля 2011

У меня есть Product, и у каждого продукта есть_мани ratings. Я пытаюсь создать область :highest_rated Product, которая упорядочивает продукты по их наивысшему среднему рейтингу (каждый рейтинг находится в таблице ratings). Я попробовал это:

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

Но это дало мне ошибку misuse of aggregate: avg().

Какие-либо советы о том, как заказать мои продукты по их наивысшему среднему рейтингу?

1 Ответ

5 голосов
/ 10 июля 2011

Это работает:

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

Чтобы получить только продукты с существующим рейтингом:

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

РЕДАКТИРОВАТЬ: вышеописанное не будет работать в PostgreSQL.Я использовал это вместо этого (который работает как в SQLite, так и в 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...