我正在尝试使用mongodb实现用户排名。因此用户有两个字段:
field :score, type: Integer, :default => 0
field :solution_count, type: Integer, :default => 0
并列出得分表中的所有用户,可以轻松地像这样做:
User.desc(:score, :solution_count).page(params[:page])
但问题是:如何在用户页面中显示用户排名?
很明显,我们需要存储等级,但 和如何正确更新?
最简单的方法就是这样:
# in user.rb
field :rank, type: Integer
# add rake task and execute is with Cron every 10 minutes for example
task :build => :environment do
User.desc(:score, :solution_count).each_with_index do |user, position|
user.update_attribute(:rank, position + 1)
end
end
如何更好地实施它?
答案 0 :(得分:1)
如果您不需要按等级查询,则可以即时计算。比方说,你的页面大小是20,你就是第一页。然后用户将在1到20之间排名。下一页的用户排名将为21-40。等等。
page_no = params[:page].to_i
users = User.desc(:score, :solution_count).page(page_no)
users.each_with_index do |u, idx|
u.rank = (page_no * page_size) + idx + 1
end
# go on and display users with ranks.
<%= u.rank %>