ActiveRecord:如何按相关模型的加权平均排序?

时间:2015-02-19 12:53:59

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我有3个型号,

    #user.rb
    class User < ActiveRecord::Base
       has_many :pictures
       has_many :ratings, dependent:  :destroy
       has_many :rated_pictures, through: :ratings, source: :picture
    end

    #picture.rb    
    class Picture < ActiveRecord::Base
       #id, image, :user_id
       has_many :ratings, dependent:  :destroy
       has_many :rated_users, through: :ratings, source: :user

       def weighted_average
          data = ratings.group("stars").count
          w_sum = 0
          data.each{ |key, value| w_sum += key * value }
          (w_sum.to_f/data.values.sum).round(2)
       end
    end

    #rating.rb
    class Rating < ActiveRecord::Base
      #id, user_id, picture_id and stars
      belongs_to :user
      belongs_to :picture
    end

用户可以使用功能 picture.weighted_average 对其他用户的图片进行评分,我正在计算图片的平均值(加权平均值)。

# To can get a user's pictures 
user = User.find_by_email 'abc@sample.com'
pictures = user.pictures

我的查询是如何使用ActiveRecord通过weighted_average订购用户图片?

2 个答案:

答案 0 :(得分:0)

使用Array#sort功能。

user.pictures.sort { |p1, p2| p1.weighted_average <=> p2.weighted_average }

答案 1 :(得分:0)

您无法通过ActiveRecord(即在数据库中)执行此操作,因为您的Ruby代码中定义了weighted_average函数。您可以做的最好的事情是从数据库中检索所有对象,未排序,然后对它们进行排序:

user.pictures.sort_by(&:weighted_average)