Ruby on rails ActiveRecord:如何通过模型按关联的加权平均值排序?

Ruby on rails ActiveRecord:如何通过模型按关联的加权平均值排序?,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 4,我有三个模型 #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 &l

我有三个模型

    #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
我的问题是如何使用ActiveRecord?

和函数通过加权平均排序用户图片

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

您不能通过ActiveRecord实现这一点,也就是在数据库中,因为加权平均函数是在Ruby代码中定义的。最好是从数据库中检索所有未排序的对象,然后对它们进行排序:

user.pictures.sort_by(&:weighted_average)

更简洁地说,user.pictures.sort_by&:weighted_average好的,它可以工作,但这需要额外的查询来查找每个图片记录的加权_average 0.3ms选择COUNT*作为COUNT_all,从ratings WHERE.picture_master_id=$1 groupby stars[[picture_master__id,145]]。我计划将列加权平均值添加到图片表中以存储值,并在每次创建评级时更新此值。把你的想法放在这上面。
user.pictures.sort_by(&:weighted_average)