我有一個應用程序,可以爲使用game_type的遊戲玩遊戲的用戶提供積分。我想要做的是:如何顯示不同分類彙總中的最高排名
- 大部根據遊戲積分
- 判斷基礎上,他們多少分都爲game_id相比其他用戶 用戶的遊戲等級(1級=最高分)基於game_type
- 小計點確定用戶game_type基礎上,他們多少分都爲game_type_id相比其他用戶
基於查詢resul等級(等級1 =最高分)以上我只想顯示game_types和遊戲之間的排名前五位。
例如,讓我們說,計算是本作的用戶:
game_id = 1, rank 200
game_id = 2, rank 10
game_id = 3, rank 6
game_id = 4, rank 31
game_type_id = 1, rank 500
game_type_id = 2, rank 400
game_type_id = 3, rank 1
game_type_id = 4, rank 7
game_type_id = 5, rank 100
那我就只想顯示遊戲排名:2,3,4和game_types:3,4,5因爲這些是該用戶的遊戲和game_types中的前五名。
我想過爲用戶表中的每個game_type和game(例如game_1_rank,game_2_rank,game_type_1_rank等)創建一個game_type和game field,以便我可以計算每小時後臺作業中的點數,然後試圖檢索但是我不認爲這是自新遊戲和game_types隨着時間的推移而增加的最佳方法。
因此,我認爲最好的方法是在用戶#show頁面加載並緩存該頁面(並每小時到期)時進行計算。
我的模式是這樣的:
user
has_many :points
point
belongs_to :game
belongs_to :game_type
belongs_to :user
game
has_many :points
has_one :game_type
game_type
has_many :points
我在用戶#這個代碼顯示計算總體排名爲所有的遊戲和game_types的,但我不知道如何調整它,所以我可以訪問我認爲的最高排名(在我看來,我還沒有代碼可以顯示這個用戶的前五名和他們的遊戲/遊戲類型)。
# calculate ranks for all users for all games in order to find the user's rank
@games = Game.all
@games.each do |game|
@users_by_game = Point.where(「game_id = ?」, game.id).select("sum(amount) as points, user_id").order("points desc").group("user_id")
rank = 0
points = 0
@users_by_game.each_with_index do |user_by_game, index|
if user_by_game.points != points
points = user_by_game.points
rank += 1
end
end
# calculate ranks for all users for all games_types in order to find the user's rank
@game_types = GameType.all
@game_types.each do |game_type|
@users_by_game_type = Point.where(「game_type_id = ?」, game_type.id).select("sum(amount) as points, user_id").order("points desc").group("user_id")
rank = 0
points = 0
@users_by_game_type.each_with_index do |user_by_game_type, index|
if user_by_game_type.points != points
points = user_by_game_type.points
rank += 1
end
end
end
我試圖確定的是:
- 這是計算這些隊伍最好的辦法還是有更多的資源有效的或乾的呢?
- 如果這是最好的方法,我該如何更改我的代碼並查看此@user的最高5個遊戲/ game_type排名,因爲代碼現在僅爲所有用戶計算排名?
非常感謝哈里斯!我會試試這個,讓你知道! – yellowreign 2013-03-04 23:04:56
嗨哈里什,我有幾個問題,只是因爲我想了解代碼在做什麼。排名如何計算?我無法弄清楚它是如何遞增的。此外,我想知道是否需要在GameRank.find_or_create之後添加.save(或者該語句是否也保存找到的記錄,如果存在的話)。謝謝! – yellowreign 2013-03-04 23:14:39
我已經更新瞭解決更新問題的答案。我假設你正在使用Postgres數據庫。您可以在Postgres中使用Window函數來計算等級。理論上,您可以更新'Point'模型的'after_save'中的等級,但根據用戶數量計算等級的成本可能會過高。所以最好定期計算它。 – 2013-03-05 01:15:35