Ruby on rails 如何创建一个类/作用域方法,该方法基于实例方法中的值对对象进行排序?
我花了几个小时努力开发一个类或范围方法,但是我对SQLite有一个初学者的知识,而且我尝试和阅读的所有东西到目前为止都失败了 我正试图找到一种方法,根据列表的平均评分对列表进行排序 我有很多/属于列表和评级之间的关联。列表有很多评级,每个列表可以有很多评级。然后我有一个实例方法来计算列表的平均评级:Ruby on rails 如何创建一个类/作用域方法,该方法基于实例方法中的值对对象进行排序?,ruby-on-rails,ruby,sqlite,arel,class-method,Ruby On Rails,Ruby,Sqlite,Arel,Class Method,我花了几个小时努力开发一个类或范围方法,但是我对SQLite有一个初学者的知识,而且我尝试和阅读的所有东西到目前为止都失败了 我正试图找到一种方法,根据列表的平均评分对列表进行排序 我有很多/属于列表和评级之间的关联。列表有很多评级,每个列表可以有很多评级。然后我有一个实例方法来计算列表的平均评级: def average_rating self.ratings.average(:rating).to_i end 我现在正试图找到一种按平均评分排序的方法,但没有成功。在另一篇帖子之后,我
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.all.sort_by(5) # you sort by result of the method which is simple number
不过这没什么意义
我认为您需要将average_rating
列添加到您的列表中。您将能够计算每个列表的平均评级,并将该值存储在列中,然后按该列对列表进行如下排序
def self.highest_rating
List.all.order(average_rating)
end
要计算您的平均评分,您可以在每次创建新评分时使用callback。它可能看起来像:
class Rating < ActiveRecord::Base
after_save :calculate_average
private
def calculate_average
#your code
end
end
等级
谢谢您的帮助!我将按照您的建议添加属性。