`ActiveRecord::Base.connection` の直接呼び出しを `with_connection` に移行

activeadmin/activeadmin

ActiveAdminが ActiveRecord::Base.connection の直接使用を廃止し、with_connection ブロックへ置き換えました。これにより、permanent_connection_checkout = :disallowed 設定を使用している環境でのエラーが解消されます。

背景

Rails 7.2以降で導入された config.active_record.permanent_connection_checkout 設定により、ActiveRecord::Base.connection の直接呼び出しを制御できるようになりました。この設定を :disallowed にすると、コネクションプールからのコネクションを恒久的にチェックアウトするコードを検出・排除できます。

Fiberベースの環境(非同期処理など)では、スレッド数よりもはるかに多くのFiberが存在する可能性があります。この状況で ActiveRecord::Base.connection を使用すると、コネクションプールが枯渇するリスクがあります。そのため :disallowed 設定はFiberを多用するアプリケーションで推奨されますが、ActiveAdminはこの設定と非互換でした(#8881)。

具体的には permanent_connection_checkout = :disallowed を設定した状態で管理画面にアクセスすると、以下のエラーが発生していました:

ActiveRecord::ActiveRecordError in Admin::CommentsController#index

Called deprecated `ActiveRecord::Base.connection` method.
Either use `with_connection` or `lease_connection`.

Rails 8.xではこの呼び出しが例外を発生させるようになったため、対応が必須となっていました。

技術的な変更

lib/active_admin/resource.rbresource_quoted_column_name メソッドが、with_connection ブロック形式に変更されました。

変更前:

def resource_quoted_column_name(column)
  resource_class.connection.quote_column_name(column)
end

変更後:

def resource_quoted_column_name(column)
  resource_class.with_connection do |connection|
    connection.quote_column_name(column)
  end
end

テスト側でも対応が行われています。spec/unit/resource_controller/data_access_spec.rb では、クエリキャッシュの状態を検査する箇所で ActiveRecord::Base.connection から ActiveRecord::Base.lease_connection に変更されました。lease_connection はコネクションを一時的に借用する明示的なAPIで、テストコンテキストでの使用に適しています。

さらに spec/support/rails_template.rbconfig.active_record.permanent_connection_checkout = :disallowed が追加され、テストスイート自体がこの制約下で実行されるようになりました。これにより、同様の問題が再発した場合にCI上で検出できます。

設計判断

with_connection ブロック方式 を採用することで、コネクションのスコープが明示的になります。with_connection はブロックの実行中のみコネクションをチェックアウトし、ブロック終了後にプールへ返却します。これに対し、従来の connection はリクエストやジョブの終了まで保持し続ける挙動でした。

Railsが参照先として示す rails/rails#51349 では、connection による恒久チェックアウトがFiber環境での問題の根源であることが説明されています。with_connection への移行はRailsの推奨ガイドラインに沿う判断であり、将来のRailsバージョンとの互換性を維持するうえでも合理的な選択です。

テストテンプレートへの :disallowed 設定の追加は、リグレッション防止の仕組みを組み込む判断として注目できます。修正が正しく動作することを確認するだけでなく、今後の変更で同じ問題が再発しないよう、CI環境を厳格な制約下に置いています。

まとめ

本PRはActiveAdminが抱えていたコネクション管理の非互換を、with_connection への移行という最小限の変更で解消しています。テストスイートに :disallowed 設定を組み込んだことで、同種の問題を継続的に検出できる体制が整い、Rails 8.x以降との長期的な互換性が確保されました。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
5f02b817

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文(総論)→セクション群(各論)→まとめ(結論)の構成が明確です。背景、技術的な変更、設計判断のセクションがそれぞれ役割を果たしており、非常に理解しやすい構成になっています。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きのシンタックスハイライト(```ruby:ファイルパス)や、GitHubのIssue/PRへのリンク記法([#8881](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

内容は専門知識を持つエンジニア向けに書かれており、`permanent_connection_checkout`やFiber環境に関する前提知識が適切に扱われています。過度な説明がなく、簡潔です。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論・各論で構成され、各パラグラフがトピックセンテンスで始まっています。1段落1トピックの原則も守られており、非常に可読性が高いです。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されている`lib/active_admin/resource.rb`のコード変更は、提供されたDiffと完全に一致しています。テストコードに関する説明もDiffの内容を正確に反映しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`with_connection`, `lease_connection`, `permanent_connection_checkout` などの技術用語が文脈に応じて正確に使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

`with_connection`がコネクションのスコープを限定する仕組みや、Fiber環境におけるコネクション枯渇のリスクなど、技術的な説明は正確かつ論理的です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事の主張はすべてPRのDescription、Diff、参照Issueから裏付けが取れます。「Rails 8.xでは例外が発生する」という記述もPR Descriptionに明記されており、ハルシネーションは見られません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#8883)、Issue番号(#8881)、参照PR番号(rails/rails#51349)など、記事に含まれる数値や固有名詞はすべて正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

PRのタイトル「Drop legacy connection support」の内容を、より具体的な「`ActiveRecord::Base.connection` の直接呼び出しを `with_connection` に移行」という記事タイトルで的確に表現しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

記事内で言及されているRailsのバージョンに関する情報は、PRの文脈や参照先PRに基づいており、不確かな外部知識の追加はありません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「Rails 8.xでは...なったため、対応が必須となっていました」という時間表現は、PRの文脈と一致しており、事実を正確に伝えています。