認証エンジンにAuthLogicを使用しているが、usersテーブルにlast_request_atというカラムがあると、毎回リクエストの度にusersテーブルに対して、last_request_atを更新するクエリが発行される。
通常の処理であれば特に問題無いのだけれど、Ajaxで複数のリクエストを同時に発行すると、usersテーブルにもリクエストの数分、更新処理が走る。その際、タイミングによってusersテーブルのlock_versionの整合性がとれずに更新しようとして、ActiveRecord::StaleObjectErrorが発生することがある。
んー、微妙と思ってたら、処理を行うRailsのController内にlast_request_update_allowed?というメソッドを定義し、そのメソッドがfalseを返すとAuthLogicはlast_request_atの更新は行わないみたい。
def last_request_update_allowed? return false end
アクション単位に切り替えたい場合は、last_request_update_allowed?メソッド内で該当アクションの判定を行って結果を返せば良い。あまり意味は無いが、ApplicationController内に定義すると全てのコントローラに対して同じ効果を与えられる。
こういったカスタマイズポイントが結構あるのがAuthLogicの良いところ。