読者です 読者をやめる 読者になる 読者になる

Develop with pleasure!

福岡でCloudとかBlockchainとか。

AuthLogic使用時にUserテーブルがアクセス毎に更新される。

Rails

認証エンジンに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の良いところ。