$ cat rails/month/2026-08-01.log
the month in review · August 2026
Rails deepens Ractor safety, ships Marcel 2.0, and retires decade-old APIs
August saw Rails push forward on three fronts: a sustained campaign to make Active Record safer under Ractor and concurrency, the release of Marcel 2.0 with 10x fewer reads, and a wave of deprecations aimed at Rails 9.0.
The month's most sustained theme was Ractor safety and correctness across Active Record, notifications, and storage. Internal work made alias-resolved foreign keys and types cacheable and thread-safe, with fixes landing for composite and aliased foreign keys in counter cache, autosave, and has_many :through nullify [1]. A related fix restored `alias_attribute` support in associations, resolving silent failures that had crept in [2]. For applications relying on attribute aliases in belongs_to tracking, these changes close real correctness gaps, not just theoretical ones.
Rails also tidied its public API for the long march to 9.0. Positional `pk`, `id_value`, and `sequence_name` arguments to `#insert` are now deprecated [3], and passing `binds` to `insert`, `update`, and `delete` is deprecated with removal unified to Rails 9.0 [4]. The deprecation horizon now aligns consistently [5][6]. A silent cross-tenant write risk was flagged: `Relation#update` ignoring scope could write outside a tenant's scope, a behavior change Rails is addressing [ref:18 from the daily briefing].
The ecosystem matured alongside core. Solid Queue shipped batches and now lets workers die on finalization failure to free stuck claims [ref:22 from the daily briefing]. Solid Cable shipped encryption and a `broadcast_batch` method [ref:28 from the daily briefing]. Mission Control Jobs 1.2.0 landed with job filtering and timezone fixes, listing failed jobs newest first [ref:30 from the daily briefing]. Action Push native matured with structured provider errors, push instrumentation, and Retry-After-aware retries, plus a bump to httpx 1.7.6 [7].
Marcel, the file type detection library, had a landmark month. Marcel 2.0.0 landed after an overhaul that cut detection reads 10x and added canonical MIME types [ref:23 from the daily briefing]. Active Storage upgraded to Marcel 2, meaning applications get more accurate, typed MIME detection out of the box [ref:29 from the daily briefing]. Sprockets also gained an off switch for cache limits, giving deployers more control over cache bloat [ref:19 from the daily briefing].
The month closed with Rails core continuing to slim down: Arel and query cache deadweight were pruned, and ERB got an HTML-aware overhaul that changes how ERB templates handle HTML structure [ref:26 from the daily briefing]. The Rails World 2026 programme went live [ref:7 from the daily briefing]. If you run applications that rely on raw MIME detection or complex has_many through associations, test against the new deprecations and the alias fixes before upgrading.
References
- [1] Honor composite / aliased FKs in belongs_to counter cache, autosave, and has_many :through nullify ↗ rails/rails
- [2] Restore `alias_attribute` support in associations ↗ rails/rails
- [3] Deprecate positional `pk`, `id_value`, and `sequence_name` for `#insert` ↗ rails/rails
- [4] Deprecate passing `binds` to `insert`, `update`, and `delete` ↗ rails/rails
- [5] Unify deprecation removal target to Rails 9.0 ↗ rails/rails
- [6] Align default `deprecation_horizon` with the rest of the codebase ↗ rails/rails
- [7] Bump httpx from 1.6.3 to 1.7.6 ↗ rails/action_push_native
$ ls rails/month/ # the briefings behind this review