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

时间:2017-02-04 08:13:15

标签: ruby-on-rails ruby sqlite arel class-method

我一直在努力开发一个类或范围方法几个小时,但是对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模型的一个属性,但是甚至难以开发一个范围方法。如果您能提供任何建议或帮助,我将不胜感激!

1 个答案:

答案 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