我有一個應用程序,用戶可以收到遊戲積分。我的代碼中存在一個錯誤,這意味着在過去的一週內(在GameTypeRank表中)按Game_Type對每個用戶的點數進行小計和排名。如果用戶在過去一週內有積分,這可以正常工作,但如果用戶在過去一週內沒有積分,則無法正常工作。如果用戶沒有積分,那麼他們應該在GameTypeRank中更新爲0分,否則他們會保留最後的排名直到更新(並且排名不正確)。Rails:與Rails查詢相關的邏輯錯誤
# user.rb:
def self.update_game_type_weekly_rank
@game_types = GameType.all
@game_types.each do |game_type|
# this query is where the bug is since it is possible a User has no Points
@user_with_points = Point.where("game_type_id = ? and created_at >= ?", game_type.id, 1.week.ago).sum(:points, :group => :user_id, :order => 'sum(points) desc')
rank = point_counter = 0
@user_with_points.each do |user_id, points|
@game_type_rank = GameTypeRank.find_or_create_by_user_id_and_game_type_id(user_id, game_type.id)
if points != point_counter
point_counter = points
rank += 1
end
@game_type_rank.weekly_rank = rank
@game_type_rank.weekly_points = points
@game_type_rank.save
end
end
end
# Models
# game_type_rank.rb
# fields - user_id, game_type_id, weekly_points, weekly_rank
belongs_to :game_type
belongs_to :user
# point.rb
# fields - user_id, points, game_type_id
belongs_to :game
belongs_to :game_type
belongs_to :user
我可以創建每週運行,並創建點記錄(含Point.points = 0),對於沒有任何一週的每個用戶,但是這是一個貧窮的解決方案的方法。
我也可能會在方法開始時爲每個GameTypeRank記錄初始化weekly_points
和weekly_rank
,但對我來說這似乎效率低下(我不確定是否執行此操作的最佳方式)。
# Sample Data
Points
|user_id|points|game_type_id|created_at
|1 | 10 | 1|2013-05-07
|1 | 10 | 2|2013-05-07
|2 | 20 | 2|2012-12-31
|1 | 5 | 2|2012-12-31
before weekly_update - Game_Type_Ranks
|user_id |game_type_id | weekly_points | weekly_rank|
|1 |2 |5 |2
|2 |2 |20 |1
after weekly_update - Game_Type_Ranks
|user_id |game_type_id | weekly_points | weekly_rank|
|1 |1 |10 |1
|1 |2 |10 |1
|2 |2 |20 |1
what should happen after weekly_update - Game_Type_Ranks
|user_id |game_type_id | weekly_points | weekly_rank|
|1 |1 |10 |1
|1 |2 |10 |1
|2 |2 |0 |2 <== update for user_id 2
一些示例輸入數據以及預期和實際輸出將會很有用。 – 2013-05-08 00:21:02
我添加了一些示例數據,謝謝 – yellowreign 2013-05-08 00:33:59
本週沒有活動的用戶是否需要每週有0個點。我們可以將它們排除在外嗎? – bennick 2013-05-08 16:25:12