按分数排序用户 - rails

时间:2014-04-17 12:14:57

标签: ruby-on-rails ruby ruby-on-rails-4

在我的rails应用程序中,每个用户都有一个业力/分数,我通过用户模型计算如下:

after_invitation_accepted :increment_score_of_inviter

def increment_score_of_inviter
  invitation_by.increment!(:score, 10)
end

def comment_vote_count
  Vote.find(comment_ids).count * 2
end

def calculated_vote_count
  base_score + comment_vote_count
end

def recalculate_score!
  update_attribute(:score, calculated_vote_count)
end

我尝试创建所有用户的分页列表,按其分数排序。有数千名用户,我该如何有效地做到这一点?

我想到了使用:

User.all.sort_by(&:calculated_vote_count)

但是,这将非常沉重。

2 个答案:

答案 0 :(得分:1)

非常直接:

User.order('score DESC').all

显然,你和Kaminari有User.order('score DESC').page(params[:page]).per(20)的分页。

答案 1 :(得分:1)

嗯......在一个充满记录的表上使用User.all将是你的应用程序的内存耗费。相反,你应该尝试在数据库层上完成你想要的东西。

此时我假设base_score是表格列之一(base_scorescore相同?),所以你必须做点什么如下所示(使用LEFT JOIN):

User.select("users.*, (COUNT(votes.id) * 2 + users.base_score) AS calculated_vote_count").joins("LEFT JOIN votes ON votes.user_id = user.id").order("calculated_vote_count DESC")

然后你可以按自己喜欢的方式对结果进行分页。

我没有测试它,但它应该可以工作。如果没有,请告诉我。