レガシー接続APIの廃止をRails < 7.2へバックポート

activeadmin/activeadmin

3-0-stableブランチに対し、Rails 8.xで直接呼び出しが不可となったActiveRecord::Base.connectionの廃止変更をバックポートしました。Rails < 7.2との互換性を保つため、すべての接続API切り替えはバージョン・機能検出による条件分岐で制御されています。

背景

Rails 8.xではActiveRecord::Base.connectionの直接呼び出しが例外を送出するようになり、with_connectionブロックを使った明示的な接続管理が推奨されています。この変更は元々#8883でmainブランチに取り込まれ、レガシー接続サポートの廃止とRails推奨スタイルへの統一が行われました。

3-0-stableブランチはRails < 7.2を引き続きサポートしているため、mainブランチのチェリーピック(コミットe602ef7)をそのまま適用することはできませんでした。with_connectionはRails 7.2で導入されたAPIであり、それ以前のバージョンでは存在しないからです。本PR(#8965)は、コンフリクト解消を経てこのギャップを埋めるバックポートです。

技術的な変更

接続APIの切り替えは「バージョン番号の比較」ではなく「メソッドの存在確認(respond_to?)」によるランタイム検出で実装されており、将来のRailsバージョンへの追従も自動で行われる設計になっています。

lib/active_admin/resource.rbresource_quoted_column_name メソッドが最初の変更箇所です。

変更前:

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

変更後:

def resource_quoted_column_name(column)
  if resource_class.respond_to?(:with_connection)
    resource_class.with_connection do |connection|
      connection.quote_column_name(column)
    end
  else
    resource_class.connection.quote_column_name(column)
  end
end

spec/unit/resource_controller/data_access_spec.rb のテストコードも同様のパターンで修正されています。in_paginated_batchesのテスト内でActiveRecord::Base.connectionを直接参照していた箇所が、lease_connection の存在確認を経た条件分岐に置き換えられました。lease_connectionwith_connectionと同じくRails 7.2で追加された接続リースAPIです。

connection = if ActiveRecord::Base.respond_to?(:lease_connection)
               ActiveRecord::Base.lease_connection
             else
               ActiveRecord::Base.connection
             end
expect(connection.query_cache_enabled).to be_falsy

テスト環境の設定についても、spec/support/rails_template.rbpermanent_connection_checkout = :disallowed の設定がRails 7.2以降にのみ適用されるよう条件付けられています。

# Disallow permanent connection checkout (Rails >= 7.2)
if Rails.gem_version >= Gem::Version.new("7.2.0")
  environment "config.active_record.permanent_connection_checkout = :disallowed"
end

この設定により、Rails 7.2以降の環境では接続の永続チェックアウトを禁止してテストを実行し、connectionの直接呼び出しが残っていれば早期に検出できます。あわせて spec/unit/resource_spec.rbresource_quoted_column_name の動作を検証するテストケースが追加されました。

設計判断

respond_to?によるランタイム検出を採用した点がこのバックポートの核心です。Rails.gem_versionとの比較による静的なバージョン分岐ではなく、対象メソッドの存在をその場で確認する方式を取ることで、将来的にAPIが追加・変更された場合にも条件分岐のメンテナンスが不要になります。プロダクションコード(resource.rb)ではwith_connectionの有無を、テストコード(data_access_spec.rb)ではlease_connectionの有無をそれぞれ検出しており、文脈に応じた適切なAPIを使い分けています。

一方、テスト環境のセットアップ(rails_template.rb)ではGem::Versionによる明示的なバージョン比較が使われています。これはアプリケーション起動時の設定生成フェーズで使用されるコードであり、permanent_connection_checkoutという設定キー自体がRails 7.2未満では存在しないためです。ランタイムの動的な検出が適さない文脈では静的なバージョン比較を使い、プロダクションコードとテストセットアップで検出手段を使い分けた合理的な判断といえます。

まとめ

本PRは、Rails 8.xで非推奨となった接続APIの廃止をRails < 7.2との互換性を維持しながら3-0-stableへ導入した変更です。respond_to?によるランタイム検出という共通パターンを採用することで、コードの変更箇所を最小限に抑えつつ、複数のRailsバージョンにまたがる3-0-stableブランチの継続的な健全性を確保しています。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
e2f48a8d

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

品質レビュー結果

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

Review Criteria:

記事構成 ✓ PASS

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

「総論→各論→結論」の3部構成が明確です。リード文、背景、技術的な変更、設計判断、まとめの各要素がすべて含まれており、理想的な構成です。

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きシンタックスハイライト、GitHubのPR番号へのリンク記法が正しく使用されています。

対象読者への適合性 ✓ PASS

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

専門用語が適切に使用されており、対象読者であるエンジニアに適した技術レベルと表現になっています。

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

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

各セクションが「総論→各論」で構成され、各段落はトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が遵守されています。非常に読みやすい構造です。

Diff内容との照合 ✓ PASS

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

記事内で引用されているすべてのコードブロックは、提供されたDiff情報と正確に一致しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「バックポート」「ランタイム検出」「lease_connection」などの技術用語が、文脈に沿って正確に使用されています。

説明の技術的正確性 ✓ PASS

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

「respond_to?によるランタイム検出」と「Gem::Versionによる静的チェック」の使い分けなど、技術的な説明が論理的かつ正確です。

事実の突合 ✓ PASS

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

記事内の主張はすべてPRのDescriptionやDiff内のコードで裏付けられており、ハルシネーションは見られません。「設計判断」セクションはコードの意図を的確に言語化した良い解説です。

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

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

PR番号(#8965, #8883)、コミットID(e602ef7)、バージョン番号(7.2)などの数値・固有名詞はすべて正確です。

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

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

記事のタイトルはPRの主題「レガシー接続APIの廃止をRails < 7.2向けに条件付きでバックポートする」を的確に表現しています。

外部知識の正確性 ✓ PASS

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

RailsのバージョンごとのAPI導入状況に関する言及は、PRのコード変更(バージョンチェック)から裏付けられる範囲であり、捏造された外部知識は含まれていません。

時間表現の正確性 ✓ PASS

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

「〜で導入された」「将来の〜」といった時間表現は、PRの文脈と矛盾なく正確に使用されています。