我花了数小时努力尝试开发类或范围方法,但是对SQLite有一个初学者的了解,到目前为止,我尝试和阅读的所有内容都失败了。
我正在尝试找到一种按列表的平均评分排序的方法。
我在列表和评分之间具有has_many / belongs_to关联。列出have_many个评分,每个List可以具有have_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" = ?
我曾考虑过在List模型上使均值成为一个属性,但是甚至很难为此开发一个范围方法。如果您能提供任何建议或帮助,我将不胜感激!
最佳答案
首先,您可以按任何列而不是值对查询结果进行排序。现在,当您尝试按平均评分进行排序时,您会喜欢
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
关于ruby-on-rails - 如何创建一个基于实例方法的值对对象进行排序的类/作用域方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42038088/