Ruby on rails 如何创建一个类/作用域方法,该方法基于实例方法中的值对对象进行排序?

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 我现在正试图找到一种按平均评分排序的方法,但没有成功。在另一篇帖子之后,我

我花了几个小时努力开发一个类或范围方法,但是我对SQLite有一个初学者的知识,而且我尝试和阅读的所有东西到目前为止都失败了

我正试图找到一种方法,根据列表的平均评分对列表进行排序

我有很多/属于列表和评级之间的关联。列表有很多评级,每个列表可以有很多评级。然后我有一个实例方法来计算列表的平均评级:

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
等级
谢谢您的帮助!我将按照您的建议添加属性。