0

ユーザーがゲームのポイントを受け取るアプリがあります。過去 1 週間 (GameTypeRank テーブル内) の Game_Type ごとに各ユーザーのポイントを小計してランク付けすることを意図したコードにバグがあります。これは、ユーザーが過去 1 週間のポイントを持っている場合は正常に機能しますが、ユーザーが過去 1 週間のポイントを持っていない場合は正しく機能しません。ユーザーがポイントを持っていない場合、GameTypeRank で 0 ポイントに更新する必要があります。それ以外の場合は、更新されるまで最後のランキングを保持します (ランクは正しくありません)。

# 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) を作成するメソッドを作成できますが、それは不十分なソリューションです。

weekly_pointsまた、メソッドの先頭で各 GameTypeRank レコードのandを初期化することもできます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
4

1 に答える 1