2017-02-04 17 views
1

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

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

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

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" = ? 

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

ответ

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 
+0

благодарит за вашу помощь! Я собираюсь добавить атрибут, как вы предложили. – Dog

 Смежные вопросы

  • Нет связанных вопросов^_^