ActiveRecord::SessionStore を利用している場合に reset_session した後で session_id を取得する

たまには仕事の話をします。rails バージョン 2.3.8 での話。

通常 reset_session してしまうと、そのセッションの id は失われてしまいます。reset_session 後にセッションの id を取得したい場合には、request.session_options[:id] に自前で id を発行することで回避することができます。
が、ActiveRecord::SessionStore を利用している場合には request.env[ActiveRecord::SessionStore::SESSION_RECORD_KEY] を空にしておかないと、レコードを作り直してくれないので、自前で発行した id を持つレコードが存在しない状態になってしまいます。

ということで、

def reset_and_create_session_for_active_record
  request.env[ActiveRecord::SessionStore::SESSION_RECORD_KEY] = nil
  reset_session
  request.session_options[:id] = ActiveSupport::SecureRandom.hex(16)
end

みたいな感じでやりましょう。あどほくー。次。