RepoJournal

$ cat rails/month/2026-08-01.log

Rails

Rails

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.

582 commits 326 PRs merged 8 releases 31 briefings covered

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. [1] Honor composite / aliased FKs in belongs_to counter cache, autosave, and has_many :through nullify ↗ rails/rails
  2. [2] Restore `alias_attribute` support in associations ↗ rails/rails
  3. [3] Deprecate positional `pk`, `id_value`, and `sequence_name` for `#insert` ↗ rails/rails
  4. [4] Deprecate passing `binds` to `insert`, `update`, and `delete` ↗ rails/rails
  5. [5] Unify deprecation removal target to Rails 9.0 ↗ rails/rails
  6. [6] Align default `deprecation_horizon` with the rest of the codebase ↗ rails/rails
  7. [7] Bump httpx from 1.6.3 to 1.7.6 ↗ rails/action_push_native

$ ls rails/month/ # the briefings behind this review

Sat Aug 1 RAILS HARDENS ERROR HANDLING FOR PUSH NOTIFICATIONS, REVERTS SCHEMA DUMP BREAKING CHANGE Sun Aug 2 RAILS DEPRECATES BINDS PARAMETER, UNIFIES REMOVAL TARGET TO 9.0 Mon Aug 3 RAILS RESTORES ALIAS_ATTRIBUTE IN ASSOCIATIONS, FIXES SILENT FAILURES Tue Aug 4 Rails fixes composite foreign key tracking across counter cache and autosave Wed Aug 5 RAILS HARDENS FILE STORAGE, UNIFIES FOREIGN KEY HANDLING ACROSS 22 COMMITS Thu Aug 6 RAILS FIXES PLUCK REGRESSION, BOOTSNAP DITCHES MARSHAL FOR MSGPACK Fri Aug 7 RAILS WORLD 2026 PROGRAMME LIVE, ACTIONTEXT MARKDOWN FIXED, NESTED ATTRIBUTES INJECTION PATCHED Sat Aug 8 RAILS TACKLES RACTOR SAFETY ACROSS ACTIVE RECORD, NOTIFICATIONS, AND STORAGE Sun Aug 9 RAILS STRIPS REDUNDANT SYMBOL CACHING, BOOTSNAP FIXES YJIT CACHE MISSES Mon Aug 10 RAILS TIGHTENS SQL SAFETY AND LOGGING CONTROL IN MAINTENANCE PUSH Tue Aug 11 RAILS DEPRECATES CREATE ALIAS AS API CLEANUP CONTINUES Wed Aug 12 ACTIVE RECORD RACTOR SAFETY PUSH, JSON 3.x SUPPORT LANDS ACROSS RAILS ECOSYSTEM Thu Aug 13 RAILS HARDENS MEDIA PROCESSING, KILLS UNBOUNDED CACHE Fri Aug 14 RAILS EMBRACES HTTP QUERY METHOD, KILLS LEGACY WORKAROUNDS Sat Aug 15 RAILS TACKLES RACTOR SAFETY AND SCHEMA DUMP PERFORMANCE IN OVERNIGHT PUSH Sun Aug 16 SOLID_CABLE SHIPS ENCRYPTION, RAILS CUTS SCHEMA CACHE READS IN HALF Mon Aug 17 Rails cuts schema cache dumps in half for large databases Tue Aug 18 RELATION#UPDATE IGNORES SCOPE: SILENT CROSS-TENANT WRITES Wed Aug 19 SPROCKETS CACHE LIMITS GET AN OFF SWITCH Thu Aug 20 RAILS DIGS INTO OOXML DETECTION AS MARCEL SHIPS BOUNDARY DOCS Fri Aug 21 Rails deprecates Relation#uniq! as Marcel overhauls MIME detection Sat Aug 22 Solid Queue ships batches, Marcel slashes detection reads 10x Sun Aug 23 MARCEL 2.0.0 LANDS, RAILS CORE SLIMS DOWN Mon Aug 24 Solid Queue workers now die on finalization failure to free stuck claims Tue Aug 25 Marcel's typeless Tika matches decoded Wed Aug 26 Rail's ERB Gets an HTML-Aware Overhaul Thu Aug 27 Rails Prunes Arel and Query Cache Deadweight Fri Aug 28 SOLID_CABLE GETS REAL MESSAGES THROUGH BROADCAST_BATCH Sat Aug 29 Active Storage upgrades to Marcel 2 with canonical MIME types Sun Aug 30 Mission Control Jobs 1.2.0 lands with job filtering and timezone fixes Mon Aug 31 Mission Control lists failed jobs newest first, drops Rails main from CI