セッションIDカラムの`sessid`フォールバック廃止予定化
20年間維持されてきたsessidカラムへのフォールバック機能が廃止予定となりました。この変更により、本番環境でSchemaCacheを経由すべきクエリがランタイムで実行される問題が解消されます。
背景
アプリケーション起動時にActiveRecord::SessionStore::Sessionクラスがロードされると、sessidカラムの存在確認のためにreset_column_informationが呼び出されていました。このメソッドはsessionsテーブルのSchemaCacheをクリアし、本来キャッシュから取得すべきカラム情報が毎回データベースへクエリされる原因となっていました。#225がこの問題を報告しています。
sessidからsession_idへのカラム名変更は、2005年の452442dで行われました。それ以降、後方互換性のためにsessidカラムが存在する場合は自動的にそちらを使用する仕組みが維持されてきましたが、20年が経過した現在、この機能を使用しているアプリケーションはほとんど存在しないと考えられます。
技術的な変更
Deprecatorの定義:
lib/active_record/session_store.rbに専用のdeprecatorが追加されました:
module ActiveRecord
module SessionStore
class << self
def deprecator
@deprecator ||= ActiveSupport::Deprecation.new("3.0", "ActiveRecord::SessionStore")
end
end
end
end
このdeprecatorはRailsの最小対応バージョンが7.1であることを前提に、app.deprecatorsへの対応チェックを省略しています。
Railsへの統合:
lib/active_record/session_store/railtie.rbのイニシャライザで、deprecatorをRailsアプリケーションのdeprecatorsコレクションに登録します:
initializer "activerecord-session_store.deprecator" do |app|
app.deprecators[:"activerecord-session_store"] = SessionStore.deprecator
end
Deprecation警告の追加:
lib/active_record/session_store/session.rbのsetup_sessid_compatibility!メソッドに、sessidカラムが検出された場合の警告が追加されました:
reset_column_information
if columns_hash['sessid']
SessionStore.deprecator.warn <<~MSG
Using a session ID column other than `session_id` is deprecated without replacement. You should migrate your session table to use `session_id`.
MSG
def self.find_by_session_id(session_id)
find_by_sessid(session_id)
end
# ...
end
既存の動的メソッド定義は維持されており、sessidカラムを持つテーブルは引き続き動作しますが、警告が表示されるようになります。
テストの更新:
test/session_test.rbでは、sessidカラムを使用するテストケースにassert_deprecatedブロックが追加されました:
found = assert_deprecated(ActiveRecord::SessionStore.deprecator) do
klass.find_by_session_id("100")
end
テストヘルパー(test/helper.rb)ではdeprecatorの動作を:raiseに設定し、予期しない非推奨機能の使用を即座に検出できるようにしています。
設計判断
段階的な廃止アプローチが採用されました。このPRでは、新たな設定オプションを追加するのではなく、直接廃止予定とするアプローチが選択されています。
PR本文では「このgemは非常に安定しているため、破壊的変更にはより高い閾値を設けるべき」としながらも、20年という期間の長さから、設定オプションを経由せずに廃止予定とする判断がなされました。「sessidを使用しているアプリケーションは一つも存在しないと思われる」という記述が、この判断の根拠となっています。
警告メッセージには「without replacement」という表記があり、代替手段を提供せずsession_idへの移行のみを推奨する方針が明確にされています。
まとめ
本PRは、20年前の後方互換性コードを廃止予定とし、本番環境でのSchemaCache効率化を可能にする変更です。reset_column_informationの呼び出し削除により、セッションテーブルのカラム情報がキャッシュから取得されるようになり、不要なデータベースクエリが削減されます。バージョン3.0でのフォールバック機能削除に向けた第一歩となります。