Hi, it’s Vipul. Let’s explore this week’s changes in the Rails codebase.
Agents on Rails: Claude Fable 5.1 and GLM 5.3 Flash
Claude Fable 5.1 matched Opus 5 at the top of the Agents on Rails leaderboard with 58 of 63 successful runs, while costing less and finishing faster. The formerly unnamed ox-alpha model is GLM 5.3 Flash, which completed 52 of 63 runs for $3.31.
On Rails: Rate Limiting For Your Customers
Robby Russell spoke with Eddie Galindo and Kagen Hearn from Ascend about scaling one Rails monolith as larger customers arrived, finding the limits of its data ingestion pipeline, and shipping software that moves money.
Rails keeps moving toward Ractor support
Rails made controller configuration, Action View settings, Active Record commit callbacks, and time zone configuration shareable across Ractors.
Active Record’s schema context also no longer deadlocks when initializing attributes, while event reporters now use per-Ractor storage on non-main Ractors.
Fix TypeCaster sometimes leaking a connection
TypeCaster now uses with_connection, so it checks the connection back into the pool immediately instead of relying on executor cleanup. This fixes a connection leak seen in ActionController::Live actions.
Preserve fetch_multi key order with a local cache
ActiveSupport::Cache::Strategy::LocalCache#fetch_multi used to return local hits before misses, changing the order requested by the caller. It now returns keys in the original order, matching Store#fetch_multi.
Configure PostgreSQL error verbosity
The PostgreSQL adapter now accepts an error_verbosity option in database.yml and applies it when each connection is configured.
production:
adapter: postgresql
error_verbosity: <%= PG::PQERRORS_TERSE %>
Re-enable PostgreSQL triggers when disable_referential_integrity raises
Rails now restores disabled triggers from an ensure block. Raising inside disable_referential_integrity no longer risks leaving triggers disabled after the block exits.
Avoid a redundant join in scoped through associations
Active Record now removes duplicate joins when merging a scoped has_many :through association. The generated query keeps the joins it needs without adding the same table twice.
Shuffle unordered Active Record query results in tests
A new configuration can shuffle results from most SELECT queries without an ORDER BY, making accidental order dependencies easier to catch in the test suite.
config.active_record.shuffle_unordered_selects = true
Upgrade Active Storage to Marcel 2
Active Storage now depends on Marcel 2 for broader MIME type detection and additional hardening. Some newly analyzed files may receive canonical content types where Marcel 1 returned aliases; existing blobs keep their stored content types. Check any code that compares content type strings before upgrading.
Fix JSON 3.0 compatibility
Active Support now passes options to JSON.parse as keyword arguments, which is required by JSON 3.0. Rails also fixed custom encode options in ActiveRecord::Coders::JSON and encrypted fixtures backed by JSON columns. Apps testing JSON 3.0 should no longer hit the argument errors these paths raised.
Add timeouts to generated GitHub Actions jobs
New Rails applications now set a 15-minute timeout on each generated GitHub Actions job. Applications with longer test suites can raise or remove the limit.
Two new guides are up for review
The much anticipated Hotwire guide and a rewrite of the Securing Rails guide are open for review. Take a look and share your feedback!
You can view the whole list of changes here.
We had 25 contributors to the Rails codebase this past week!
Until next time!
Subscribe to get these updates mailed to you.