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)