ActiveSupport::Multibyte::Charsクラスの削除
Rails 8.2に向けて、既に非推奨となっていた ActiveSupport::Multibyte::Chars クラスとそれに関連する String#mb_chars メソッドがコードベースから完全に削除されました。この変更は、Ruby自体が提供するネイティブなUnicodeサポートへの移行を完了させるものです。
背景
ActiveSupport::Multibyte::Chars は、RubyがまだUnicodeの適切なサポートを持っていなかった時代に、UTF-8文字列を安全に扱うために導入されたプロキシクラスでした。String#mb_chars を呼び出すことで文字列を Chars オブジェクトでラップし、Unicode対応のメソッドチェーンを実現していました。しかし、Ruby 2.4以降では String クラス自体がネイティブにUnicode case mappingをサポートするようになり、このプロキシクラスの存在意義は失われていました。
#56777 では、当初このクラスをeager loadingの対象としようとしたものの、既に削除予定であることから、そのまま削除する判断が下されています。
技術的な変更
削除された主要なコンポーネントは以下の通りです:
削除されたファイル:
- activesupport/lib/active_support/multibyte/chars.rb (188行)
- activesupport/test/multibyte_chars_test.rb (719行)
- activesupport/test/multibyte_proxy_test.rb (36行)
ActiveSupport::Multibyte モジュールの簡素化:
module ActiveSupport
module Multibyte
autoload :Unicode, "active_support/multibyte/unicode"
end
end
proxy_class 関連のメソッドが削除され、Unicode モジュールのautoloadのみが残されています。
String#mb_chars メソッドの削除:
activesupport/lib/active_support/core_ext/string/multibyte.rb から46行のメソッド定義が削除され、空のファイルとなりました。これにより、"文字列".mb_chars という呼び出しは NoMethodError を発生させるようになります。
ActiveRecordでの参照の削除:
def quote(value)
case value
when String, Symbol
"'#{quote_string(value.to_s)}'"
when true then quoted_true
# ...
end
quote メソッドと type_cast メソッドの case 文から ActiveSupport::Multibyte::Chars の参照が削除されました。これらのメソッドは、SQL値のクォート処理で使用されており、Chars オブジェクトを特別扱いする必要がなくなっています。
テストコードの削除:
ActiveRecordの quoting_test.rb と sanitize_test.rb から、mb_chars を使用したテストケースが削除されました。これらのテストは assert_deprecated ブロック内で実行されていたものです:
# 削除されたテスト
assert_deprecated ActiveSupport.deprecator do
assert_equal "name='#{quoted_bambi}'", Binary.sanitize_sql_array(["name='%s'", "Bambi".mb_chars])
end
設計判断
このPRは、段階的な非推奨化プロセスの最終段階として実装されました。Rails 8.1までの期間、mb_chars の呼び出しには非推奨警告が表示されていましたが、Rails 8.2でコードが完全に削除されることで、この移行プロセスが完了します。
削除の判断は、以下の技術的前提に基づいています:
- Ruby 2.4以降の
Stringクラスは、upcase、downcaseなどのメソッドでネイティブにUnicode case mappingをサポート -
ActiveSupport::Multibyte::Unicodeモジュールは保持され、より低レベルなUnicode操作が必要な場合に引き続き利用可能 - ActiveRecordのquotingメカニズムは、
StringとSymbolのみを特別扱いすれば十分
コードベース全体から188行のメインクラス実装と755行以上のテストコードが削除されたことで、保守コストの削減とコードベースの簡素化が実現されています。
まとめ
本PRは、Ruby 2.4以降のネイティブUnicodeサポートへの移行を完了させる変更です。10年以上前のRuby環境での制約を回避するために導入されたプロキシクラスを削除することで、モダンなRuby環境における不要な抽象化レイヤーを取り除いています。Rails 8.2以降、アプリケーションは String クラスのメソッドを直接使用することが求められます。