Rails 4按评级参数对用户排序

时间:2014-08-31 05:51:02

标签: ruby-on-rails

在我正在构建的应用中,用户回答民意调查问题。用户有以下两个参数:

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

到目前为止,这不起作用。我错过了什么?

1 个答案:

答案 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时,您应该按用户的评级对用户进行排序。