Как создать метод класса/области, который упорядочивает объекты на основе значений из метода экземпляра?

Я часами боролся, пытаясь разработать метод класса или области, но у меня есть начальные знания SQLite, и все, что я пробовал и читал, до сих пор не увенчалось успехом.

Я пытаюсь найти способ упорядочить списки по их среднему рейтингу.

У меня есть ассоциация has_many/belongs_to между List и Rating. Списки имеют_много рейтингов, каждый список может иметь_много рейтингов. Затем у меня есть метод экземпляра, который вычисляет средний рейтинг списка:

def average_rating
   self.ratings.average(:rating).to_i
end

Сейчас я пытаюсь найти способ упорядочить списки по их среднему рейтингу, но безуспешно. После другого сообщения я попробовал этот метод:

 def self.highest_rating
    List.all.sort_by(&:average_rating)
 end

Но он просто возвращает все списки в произвольном порядке. С этим запросом:

 SELECT AVG("ratings"."rating") FROM "ratings" WHERE   "ratings"."rated_id" = ?  

Я думал о том, чтобы сделать medium_rating атрибутом модели List, но у меня возникли трудности даже с разработкой метода области действия для этого. Если вы можете предложить какой-либо совет или помощь, я был бы очень признателен!


person Dog    schedule 04.02.2017    source источник


Ответы (1)


Прежде всего, вы можете сортировать результаты запроса по любому столбцу, а не по значению. Когда вы пытаетесь отсортировать по среднему рейтингу, как вы это делаете сейчас, вам нравится

List.all.sort_by(5) # you sort by result of the method which is simple number

Хотя в этом нет большого смысла.

Я считаю, что вам нужно добавить столбец average_rating в вашу модель List. Вы сможете рассчитать средний рейтинг для каждого списка и сохранить это значение в столбце, а затем отсортировать списки по этому столбцу, как показано ниже.

def self.highest_rating
  List.all.order(average_rating)
end

Для расчета среднего рейтинга вы можете использовать обратный вызов каждый раз, когда вы создаете новый рейтинг. Это может выглядеть так:

class Rating < ActiveRecord::Base
  after_save :calculate_average

  private
    def calculate_average
      #your code
    end
end
person VAD    schedule 04.02.2017
comment
Спасибо за вашу помощь! Я собираюсь добавить атрибут, как вы предложили. - person Dog; 04.02.2017