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

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

我花了数小时努力尝试开发类或范围方法,但是对SQLite有一个初学者的了解,到目前为止,我尝试和阅读的所有内容都失败了。

我正在尝试找到一种按列表的平均评分排序的方法。

我在列表和评分之间具有has_many / belongs_to关联。列出have_many个评分,每个List可以具有have_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" = ?  


我曾考虑过在List模型上使均值成为一个属性,但是甚至很难为此开发一个范围方法。如果您能提供任何建议或帮助,我将不胜感激!

最佳答案

首先,您可以按任何列而不是值对查询结果进行排序。现在,当您尝试按平均评分进行排序时,您会喜欢

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

关于ruby-on-rails - 如何创建一个基于实例方法的值对对象进行排序的类/作用域方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42038088/

相关文章:

ruby-on-rails - rails : Is there away to get the Date object that is the closest Monday to today?

ruby-on-rails - 使用回形针通过 Activeadmin Rails 上传文件

ruby-on-rails - Rails 中查询多对多关联

ruby-on-rails - Rails 4 + append_view_path

使用关联模型的 Ruby on Rails 项目

ruby - Ruby 守护进程中的错误文件描述符

ruby - 如何在客户端计算机上将 Ruby 1.8.7 升级到 1.9

android - 通用应用程序设计(IntentService/ContentProvider/AsyncTask)

Android P - 从 Android 版本 9 中的 Assets 复制数据库后的 'SQLite: No Such Table Error'

php - PHP变量传递值后始终为空