我有一个应用程序,用户可以收到游戏积分。我的代码中存在一个错误,这意味着在过去的一周内(在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