$ cat rails/week/2026-10-12.log
the week in review · Oct 12 – Oct 18, 2026
Ractor-ready Active Record and Active Job land in Rails
By RepoJournal · composed from the cited sources · human-reviewed weekly · methodology
A week of fixes repair what ractorize! broke: job serializers, rescue_from, deprecation warnings, plus a read-only attribute set to recover the cache's speed.
Add read-only attributes and use it instead of building a cache rails/rails
Removing the builder cache for Ractor safety cost attribute-read performance; this rebase of an earlier attempt adds a read-only attribute set that can be shared instead of rebuilt. It is the performance half of the Ractor work, not a separate optimization.
Make Active Job argument serialization work in non-main Ractors rails/rails
Serializing a Time, Duration, Symbol, or anything routed through ActiveJob::Serializers raised Ractor::IsolationError in non-main Ractors after ractorize!, and so did serializing a plain Hash. Those paths now work; this is a prerequisite for running job classes outside the main Ractor at all.
Make Active Job's exception handlers work in non-main Ractors rails/rails
rescue_from, retry_on, and discard_on failed in non-main Ractors because exception handlers and after_discard_procs could not cross the isolation boundary. Jobs that raise there now follow the same error handling as jobs on the main Ractor.
Make deprecation warnings work in non-main Ractors rails/rails
The app's deprecators are frozen by ractorize!, so any deprecation warning or silence call from a job Ractor raised on Concurrent::ThreadLocalVar state. Deprecations now reach their configured behavior from any Ractor.
Short-circuit route matching for static paths rails/rails
Journey walked the GTG simulator, ran the pattern regexp, and extracted params for requests like GET /posts that the method and path alone could identify. Static paths now short-circuit that work, and the motivation is CPU rather than allocation.
Fix query constraints on abstract classes rails/rails
Since the query constraints change, reading query_constraints_list loads the schema, and an abstract class with explicit query_constraints has no table to load, so it raised TableNotSpecified. That broke associations declared on such classes; they load again.
Fix disable_joins through associations with a composite owner foreign key rails/rails
DisableJoinsAssociationScope read the owner's key with a single read_attribute call, which returns nil when the first hop's foreign key is composite, so the association failed to load. Composite-key owners and disable_joins together now resolve the key correctly.
Skip GIDs with a mismatching model_id in Locator.locate_many rails/globalid
A GID whose id count doesn't match the model's primary key, like gid://app/Person/1/2, raised NoMethodError and took the whole locate_many batch with it. Mismatched GIDs are now skipped, so one malformed record in a queue payload no longer aborts the rest.
$ ls rails/week/ # the briefings behind this review
Keep up with Rails in about 3 minutes: what actually shipped — the commits, pull requests, releases, and security advisories that matter.
fair warning: these emails are deeply technical. diffs, version numbers, CVEs, benchmark deltas. if that's not your idea of a good read, this isn't your newsletter.
Folds into your digest — weekly by default, monthly if you prefer. Unsubscribe in one click.