如何创建一个基于实例方法的值对对象进行排序的类/作用域方法?
问题描述:
我一直在努力尝试开发一个类或范围方法几个小时,但有一个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名单上的模型的属性,但有困难,甚至发展为一个范围的方法。如果您能提供任何建议或帮助,我将不胜感激!
答
首先,您可以按任何列排序查询结果而不是值。当您尝试按平均评分进行分类时,现在您喜欢
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
感谢您的帮助!我将添加您建议的属性。 – Dog