我有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订购用户图片?
答案 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)