https://github.com/rails/rails
ActiveRecordのEnum属性に無効な値を代入した際の `ArgumentError` メッセージに、有効な値の一覧が追記されるようになりました。`'bogus' is not a valid status` から `'bogus' is not a valid status. Valid values are: "proposed", "written", "published"` へと変わり、デバッグ時にモデル定義を参照する手間がなくなります。変更は `enum.rb` の1行のみで、例外クラスやトリガー条件への影響はありません。
`LookupContext::Accessors::DEFAULT_PROCS` 定数を廃止し、`register_detail` 呼び出しのたびにフリーズ済みの新Hashを再代入するクラスインスタンス変数 `default_procs` へ置き換えました。Ractor対応に向けたイミュータブル定数整備の一環で、`registered_details` 配列も `default_procs.keys` から導出する形に統合し、クラスインスタンス変数が1つ削減されています。
プロセスベースの並列テスト実行後、`Parallelization#shutdown` が `DRb.stop_service` を呼び出していなかったために DRb の accept ループスレッドが残存し、CIでテストプロセスがタイムアウトする問題を修正しました。全ワーカー回収後に `DRb.stop_service` を呼び出す2行の追加と、リークを検出するリグレッションテストが追加されています。
`insert_all` / `upsert_all` でキー不一致が発生した際のエラーメッセージに、余剰キー(extra)と不足キー(missing)の情報が付加されるようになりました。変更は `verify_attributes` メソッドのエラーパスのみに集約されており、正常系への影響はありません。
`rails plugin foo bar` のように無効なサブコマンドを渡した際にサイレントで無視される問題を修正。`PluginCommand#perform` にバリデーションを追加し、`new` 以外のサブコマンドが渡された場合はエラーメッセージを出力してステータス1で終了するようになりました。
`create_join_table`に`:primary_key`オプションが追加され、PostgreSQLの論理レプリケーションなど主キーを必要とするユースケースでも結合テーブルをRailsのマイグレーションAPIで扱えるようになりました。内部実装では`id: false`のハードコードを除き、`reverse_merge!`による1行の変更で後方互換性を完全に維持しています。
LoadAsync系テストクラスでトランザクショナルフィクスチャとコネクションプール差し替えのタイミングがずれ、PGソケットがリークしていた問題を修正。`setup` / `teardown` を `before_setup` / `after_teardown` に移行し `super` の呼び出し順を調整することで、フィクスチャが常に差し替え後のプールを使うようにした。ピーク時25〜28本あったコネクション数がベースライン(2本)まで削減され、ナイトリービルドの安定化に寄与する。
RailsのCIで断続的に発生していた `FATAL: sorry, too many clients already` エラーの原因の一つとして、テストコードが生成した一時的なPostgreSQLアダプタの接続をGCファイナライザ任せにしていた問題を修正。`with_postgresql_adapter` ブロックヘルパーを導入し `ensure` で確実に切断することで、テスト実行中のピーク接続数を最大17から5以下に削減しました。
並列テスト実行後に Active Record Pool Reaper スレッドがリークし、コネクションプールとファイルディスクリプタが解放されないバグが修正されました。原因は「Parallelization#shutdown がクリーンアップフックを呼ばない」「AR がクリーンアップフックを登録していない」「discard! が Reaper に通知しない」という3層のバグの積み重ねで、本 PR はこれらすべてを一度に解消しています。
`ActiveSupport::MessagePack` が `SafeBuffer` をシリアライズする際にエンコーディングが `ASCII-8BIT` に変換されてしまい、UTF-8文字列との連結が壊れる問題を修正しました。生のextensionバイトではなくMessagePackの文字列ペイロードを使うよう変更することで、ラウンドトリップ後もUTF-8エンコーディングと `html_safe?` の状態が保持されるようになりました。
`collection_radio_buttons` や `collection_check_boxes` にnil値を含むコレクションを渡した際、ラベルの `for` 属性に末尾アンダースコアが付いてinputの `id` と一致しないバグが修正されました。`CollectionHelpers#sanitize_attribute_name` でサニタイズ後の値が空文字列の場合にアンダースコアセパレータを省略するよう変更し、`add_default_name_and_id_for_value` との挙動を統一しています。
`MirrorService#mirror` における exist? チェックとアップロードが、既存の `@executor` スレッドプールと `Concurrent::Promise` を活用して並列実行されるようになりました。N台のミラーに対するwall timeがO(N)からO(1)のネットワークラウンドトリップに短縮され、スレッドセーフはファイル内容の凍結文字列共有と `StringIO` の個別生成で確保されています。
ネストされたトランザクション(`requires_new: true`)がロールバックした際、インメモリの `lock_version` がデータベースの状態と乖離して `StaleObjectError` が発生する問題を修正。`restore_transaction_record_state` にセーブポイントロールバック専用の処理を追加し、スナップショットの `original_value` からロッキングカラムを復元するようにした。#57363 で対処された最外層トランザクションのロールバックに対する補完的な修正。
ActiveSupport::Concurrency::ShareLockがロック所有者の識別にThread.currentを使用していたため、:fiberアイソレーション下では同一スレッド上の複数のFiberが単一オーナーとして扱われていました。このPRはオーナーシップ識別をIsolatedExecutionState.contextに切り替え、Falconのようなファイバースケジューラ環境でリクエスト処理中に定数がクリアされてしまう競合状態を修正します。
ActionDispatch::ExecutorがRack HijackやWebSocketアップグレード時にExecutor状態(リローダーのshareロック)を即座に解放するようになりました。従来はレスポンスボディのcloseまで解放されなかったため、Falconのようなfiber-scheduledサーバーではコード再ロードがクライアント切断まで無期限にブロックされていました。べき等なfinalizeクロージャへの統一とhijacked?メソッドの追加という最小限の変更で問題が解消されています。
`track_variants: false` の環境でバリアントをミラーリングすると `ActiveStorage::IntegrityError` が発生するバグを修正。`primary.open` に `verify: checksum.present?` を追加し、チェックサムが nil の場合は整合性チェックをスキップするようになりました。
`create_or_find_by` が `RecordNotUnique` エラー後にリトライする際、既存スコープと検索条件が重複してWHERE句が矛盾し `RecordNotFound` エラーが発生するバグが修正されました。リトライパスの `where(attributes).lock.find_by!(attributes)` を `rewhere(attributes).lock.take!` に置き換えることで、既存スコープの同一カラム条件を上書きし、スコープ汚染を防ぎます。
`config/puma.rb` テンプレートの `SOLID_QUEUE_IN_PUMA` チェックを修正し、`nil`・`""`・`"false"`・`"0"` を無効値として扱うようになりました。これにより、`deploy.yml` で `SOLID_QUEUE_IN_PUMA: false` と設定しても Solid Queue が有効になるという直感に反する挙動が解消されます。
ActiveStorage::AnalyzeJobがBlobを解析する際に親レコードの`lock_version`を誤って更新し、並行するフォーム編集で虚偽の`StaleObjectError`が発生する問題を修正。新設した`ActiveRecord::Locking::Optimistic.preserve_lock_version_on_touch`ブロックヘルパーで`lock_version`の更新を抑制しつつ、キャッシュ無効化のための`updated_at`更新カスケードは維持する。
`ActionDispatch::PermissionsPolicy` の `DIRECTIVES` マップに、Client Hints・Bluetooth・XR・認証情報関連など27の新機能ディレクティブが追加されました。`DIRECTIVES` 定数への追記のみという最小限の変更で、既存のポリシー設定への影響なく、近年標準化されたブラウザ機能をRailsのDSLから直接制御できるようになります。