2012-04-01 2 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

그래, 어떻게 사용자 페이지에 표시 할 수 있습니까? DB에 저장하고이 user.rank과 같은보기에 액세스해야합니다. – makaroni4

+0

내 코드 샘플을 읽으십시오. DB에서 사용자를 얻고 런타임에 순위를 계산합니다. 그런 다음 원하는대로 표시 할 수 있습니다. –

+0

나는 그것을 얻었지만, 그것을 할 수있는 적절한 곳은 어디입니까? 이 계급을 모두 재주문해야할까요? – makaroni4