2012-04-01 14 views
1

我想用mongodb實現用戶排名。所以用戶有兩個字段:用戶在rails3和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 

任何想法如何實現它更好?

回答

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 %> 
+0

是的,但我怎麼能顯示它在用戶頁面?我需要將它存儲在數據庫中,並像這個user.rank – makaroni4 2012-04-01 21:14:48

+0

閱讀我的代碼示例。您從DB獲取用戶並在運行時計算他們的排名。然後,您可以根據需要顯示它。 – 2012-04-01 21:15:42

+0

我明白了,但是在哪裏可以做到這一點?可能是我應該將所有這些等級的東西移動到redis? – makaroni4 2012-04-02 06:02:16