に遭遇しstack level too deep
、無限ループが発生しましたが、理由がわかりません。他の誰かがそれを見つけてくれることを願っています。
Game モデルに次のメソッドがあります。
def self.record_win_or_tie(game_id)
game = Game.find(game_id)
if game.home_team_score > game.away_team_score
game.home_team_won = true
game.save
end
end
同じクエリを何度も何度も実行し続ける場合、条件が true であるゲーム (つまり、game.home_team_score が game.away_team_score より大きい) のコンソールから実行すると。
SELECT `games`.* FROM `games` WHERE `games`.`id` = 1 LIMIT 1
条件が false の game_id のコードを実行すると、ゲームを探すクエリは 1 回だけ実行され、無限ループは発生しません。
* アップデート *
問題は、GameObserver からメソッドを呼び出していたことにあることがわかりました。
class GameObserver < ActiveRecord::Observer
def after_save(game)
Game.record_win_or_tie(game.id)
end
end
ただし、コードを調整する方法がわかりません。要件は、誰かが または を更新した後にまたはgame.home_team_won
を自動的に更新することです。game.away_team_won
game.home_team_score
game.away_team_score
これを行うためにオブザーバーを使用できないようです。