在我正在构建的应用中,用户回答民意调查问题。用户有以下两个参数:
correct_count
incorrect_count
当用户正确回答问题时,他/她会将+1添加到他们的correct_count。当用户回答错误时,他/她将+1添加到他们的incorrect_count。
我使用这两个参数来计算用户的评分,使用以下公式:
(((user.correct_count / (user.correct_count + user.incorrect_count))**2)
*(user.correct_count))
我想在排行榜页面上将用户从最高评级排序到最低评级。我在我的用户中添加了一个名为“rating”的列,并将其添加到我的user_params中。
def user_params
params.require(:user).permit(:name, :email, :password,
:password_confirmation, :correct_count,
:incorrect_count, :rating)
在我的用户模型中,我添加了:
def rating
if user.correct_count == 0
user.rating = 0.0
else
user.rating = (((user.correct_count.to_f / (user.correct_count.to_f +
user.incorrect_count.to_f))**2)*(user.correct_count.to_f)).round(2)
end
end
和
scope :highest_rating, -> {order("rating DESC")}
在我的用户控制器中,我有:
def index
@users = User.highest_rating.paginate(page: params[:page])
end
到目前为止,这不起作用。我错过了什么?
答案 0 :(得分:1)
您的解决方案无效,因为您没有将评级存储在数据库的User表中。如果在保存之前存储用户评级,那么您定义的范围将按预期工作。
首先,您需要生成并运行迁移,在users表中添加列'rating'。
接着,
在User
模型:
before_save do
if self.correct_count == 0
self.rating = 0.0
else
self.rating = (((self.correct_count.to_f / (self.correct_count.to_f +
self.incorrect_count.to_f))**2)*(self.correct_count.to_f)).round(2)
end
end
现在,您需要对所有用户运行save,以便您可以在users表中填写他们的评级
User.all.each {|u| u.save}
现在,当您执行User.highest_rating时,您应该按用户的评级对用户进行排序。