Arel::Table の引数をキーワード化し name: キーワードを導入
Arel::Table のコンストラクタがキーワード引数 name: を受け取る形にリファクタリングされ、呼び出し側で nil を明示的に渡す必要がなくなりました。これによりコードの可読性が向上し、将来的な拡張が容易になります。
背景
この変更は、PR #57642 で Arel::Table がオプションの引数を受け取るようになったことを受けて実施されました。以前は Arel::Table.new(nil, nil, klass) のように位置引数で nil を埋めるケースが散在しており、意図が曖昧になるリスクがありました。name: キーワードを導入することで、テーブル名だけを明示的に指定でき、余計な引数を省略できます。
技術的な変更
Arel::Table のコンストラクタシグネチャが変更されました。変更前は位置引数 def initialize(name = nil, as: nil, klass: nil, type_caster: klass&.type_caster) でしたが、以下のようにキーワード引数へ置き換えられます。
@@
- def initialize(name = nil, as: nil, klass: nil, type_caster: klass&.type_caster)
+ def initialize(name: nil, as: nil, klass: nil, type_caster: klass&.type_caster)
このシグネチャ変更に合わせて、全コードベースでの呼び出しが更新されました。代表的な置換例をいくつか示します。
@@
- table = Arel::Table.new(table_name)
+ table = Arel::Table.new(name: table_name)
```ruby:activerecord/lib/active_record/internal_metadata.rb
@@
- @arel_table = Arel::Table.new(table_name)
+ @arel_table = Arel::Table.new(name: table_name)
```ruby:activerecord/lib/arel/nodes/cte.rb
@@
- Arel::Table.new(name)
+ Arel::Table.new(name: name)
さらに、テストコードでも同様の置換が行われ、`Table.new(:users)` が `Table.new(name: :users)` に統一されています。これにより、**テストの可読性が統一**され、将来的に `Arel::Table` の引数が増えた際の影響範囲も限定的になります。
## 設計判断
`Arel::Table` の **既存キーを拡張** する方針が採用されました。代替案としては `klass:` のみをキーワード化し、`name:` は別メソッドやオプションハッシュに移行する案が議論されましたが、**後方互換性の維持** と **インターフェースのシンプルさ** が優先され、`name:` キーワードだけを追加する形が決定しました。結果として、`true`/`false` の切り替えや `klass` だけの指定は従来通り動作し、`name:` を渡すことで明示的にテーブル名を指定できます。
この設計は、**最小限のコード変更で可読性と拡張性を同時に改善**するという Rails の設計哲学に沿っています。キーワード引数は Ruby 3.0 以降の標準的な手法であり、今後のメソッド追加やデフォルト値の変更が容易になる点も評価できます。
## まとめ
`Arel::Table` のコンストラクタがキーワード引数 `name:` に変わったことで、`nil` を埋める必要がなくなりコードが直感的になりました。変更は全コードベースに適用され、テストも同様に更新されています。設計上は後方互換性とインターフェースの一貫性を重視した判断であり、今後の拡張に対する土台が整備された形です。