DATABASE_URL のブール値設定を `seeds` と `use_metadata_table` に拡張
DATABASE_URL のクエリ文字列で Boolean オプションを指定できるよう、seeds と use_metadata_table が従来の文字列まま扱われていた問題を修正し、UrlConfig が全てのブール設定を一貫して変換できるようになりました。
背景
UrlConfig は既に replica と database_tasks に対して to_boolean! を呼び出し、?replica=false などのクエリを正しく false に変換していましたが、seeds と use_metadata_table だけは変換処理が抜け落ちていました。その結果、postgres://host/db?seeds=false のような URL では configuration_hash[:seeds] が文字列 "false" のまま保持され、seeds? が真と評価されてシーディングが無効化されませんでした。PR #57717 はこの不整合を修正し、全てのブール設定 が DATABASE_URL から正しく解釈されるようにします。
技術的な変更
activerecord/lib/active_record/database_configurations/url_config.rb の initialize メソッドに、2 行の呼び出しが追加されました。
to_boolean!(@configuration_hash, :seeds)
to_boolean!(@configuration_hash, :use_metadata_table)
この追加により、@configuration_hash の :seeds と :use_metadata_table が文字列 "false" の場合 false に変換され、対応するアクセサメソッド seeds? と use_metadata_table? が正しい Boolean を返すようになります。既存の to_boolean! のロジックは変更せず、コードパスの増加は最小限に抑えられています。
テストも同様に拡充され、activerecord/test/cases/database_configurations/url_config_test.rb に test_seeds_parsing と test_use_metadata_table_parsing が新設されました。
config = UrlConfig.new("default_env", "primary", "postgres://localhost/foo?seeds=false", {})
assert_equal false, config.seeds?
config = UrlConfig.new("default_env", "primary", "postgres://localhost/foo?use_metadata_table=false", {})
assert_equal false, config.use_metadata_table?
これにより、seeds=false と use_metadata_table=false の両方が期待通り false と評価されることが自動的に検証されます。
設計判断
今回の修正は to_boolean! という既存のヘルパーメソッドを再利用し、ブール変換ロジックを新規実装せずに拡張した点が特徴です。新しい設定キーを導入する代わりに、既存の seeds と use_metadata_table キーをそのまま拡張したため、外部からの既存設定や過去のマイグレーションとの互換性が保たれます。また、コード変更が 2 行に留まることでレビュー負荷が低く、将来的に他のブール設定を追加する際のパターンも明示的になっています。
まとめ
DATABASE_URL のクエリ文字列で seeds と use_metadata_table が正しく false に変換されるようになり、Rails のデータベース構成におけるブール設定の一貫性が向上しました。既存ロジックの再利用とテスト追加により、機能追加のリスクを最小限に抑えつつ、設定の可搬性と予測可能性が高まりました。