2017-02-04 38 views
1

我一直在努力尝试开发一个类或范围方法几个小时,但有一个SQLite的初学者知识,我已经尝试和阅读的一切都失败了。如何创建一个基于实例方法的值对对象进行排序的类/作用域方法?

我试图找到一种方法,以他们的平均评级排序。

我有一个has_many/belongs_to List和Rating之间的关联。列出have_many等级,每个列表可以拥有_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名单上的模型的属性,但有困难,甚至发展为一个范围的方法。如果您能提供任何建议或帮助,我将不胜感激!

回答

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 
+0

感谢您的帮助!我将添加您建议的属性。 – Dog

相关问题