我一直在努力开发一个类或范围方法几个小时,但是对SQLite的初学者知识以及迄今为止我尝试和阅读的所有内容都失败了。
我正试图找到一种按平均等级排序列表的方法。
我在List和Rating之间有一个has_many / belongs_to关联。列表has_many评级,每个列表可以有很多评级。然后我有一个实例方法来计算列表的平均评级:
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作为List模型的一个属性,但是甚至难以开发一个范围方法。如果您能提供任何建议或帮助,我将不胜感激!
答案 0 :(得分: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