Open mayukorin opened 2 years ago
tournament_year_and_player
の remain_flag
の更新の部分で問題が起きているはず.
tournament_year
の champion
も,本来の優勝者が登録されていない.
tournament_year
の champion
が間違って登録されているということは,下のコードの if remain_players_cnt == 1
以下が実行されている時点で,優勝者の remain_flag
が false になっているということ
if @tournament_year.champion.nil?
remain_players_cnt = TournamentYearAndPlayer.where(tournament_year: @tournament_year.id, remain_flag: 't').size
if remain_players_cnt == 1
champion_id = TournamentYearAndPlayer.find_by(tournament_year: @tournament_year.id, remain_flag: 't').player.id
@tournament_year.update(champion_id: champion_id)
end
end
4/24 3:00 の時点で,優勝者の remain_flag
が false になり,champion
が一人だけとなり,間違った champion
登録がされてる.
間違って champion
に登録されている人は,match
の登録と一緒に remain_flag
が正しく false
に更新されている.
準優勝者も,4/22 21:00 の時点で, remain_flag
が false
"match.day > ?", result_nil_match.day
の部分で,match.day
は日本時間になっているのに,result_nil_match.day は現地時間になっていることが原因で,本来 result_nil_match より早い match が if でひっかかったとか?
if PlayerMatch.eager_loading.where(match: {home_player: home_player.id, tournament_year: @tournament_year.id} ).where("match.day > ?", result_nil_match.day).exists?
result_nil_match.update(win_player_id: home_player.id)
tournament_year_and_away_player = TournamentYearAndPlayer.joins(:tournament_year, :player).where(tournament_year: @tournament_year.id, player: away_player.id)
tournament_year_and_away_player.update(remain_flag: 'f')
たしかに,match.day が一部正しい時刻ではないところがある. 例)カレーニョブスタとシュワルツマンの試合.Tennis Live Data API 的には,4/24 18:00 のはずなのに,データベースでは 4/23 20:30 で登録されてる.
バッチ処理のたびに,match.day を正しいものに更新する必要はあり
原因として考えられるのは,試合結果が出ていないのに API の方で,winner_id を書いてしまっているとか?
else
の部分が原因な気がする.
result_match["result"] は nil ではないが winner_id
が nil(つまり試合途中)の場合,else
以下が実行され,試合結果に関わらず home_player
の remain_flag
が f
になってしまう.
if !result_match["result"].nil?
# 試合結果が出ている場合
if result_match["result"]["winner_id"] == result_match["home_id"]
# home_player が勝った場合
match.update(win_player_id: home_player.id)
tournament_year_and_away_player.update(remain_flag: 'f')
# tournament_year_and_home_player.update(remain_flag: 't')
else ## !!
# away_player が勝った場合
match.update(win_player_id: away_player.id)
tournament_year_and_home_player.update(remain_flag: 'f')
# tournament_year_and_away_player.update(remain_flag: 't')
end
end
この原因の仮説は合っている気がする.
優勝者と準優勝者の remain_flag
が false になった原因の match
では, 優勝者と準優勝者どちらも home_player
であるため.
バッチ処理で実行された後のため,デバックするのが難しいが検討する必要あり.