On 2 November 2026, Rails 8.0 is five calendar days from the security-support deadline currently listed as 7 November. The 30 October Rails weekly offers useful regression checks for an upgrade: association scopes, text types, attribute defaults and generated HTML.
These fixes are on pinned main, absent from the checked released tags 8.1.4 and 8.0.5.1. They are reasons to add tests before adopting a release containing them. A main merge does not establish the release that will carry a change.
The comparisons below ran on 31 October with Ruby 3.4.10, released Rails 8.1.4 and that exact main commit. Database examples used disposable, in-memory SQLite databases. AI assistance was used to prepare and review these synthetic fixtures. They contain no client data and establish no production-upgrade result.
A preload must preserve the association’s scope
PR #59444 addresses an association whose results depend on which other association was loaded first. When an unscoped has_many :through association was preloaded before a scoped one sharing the same through association, Rails could reuse already loaded intermediate records and ignore the scoped association’s filtering condition.
Preloading exists to avoid repeated association queries; it should preserve the records selected by the association. The reported example was filed against development Rails in June. Our comparison checks released 8.1.4 as well, rather than assuming that the report’s version identifies the full affected range.
On 8.1.4, loading all tags before inactive tags returned active tags in the inactive result. Reversing the order returned the correct identifiers. Main matched the ordinary association read in both orders, including active-only and empty controls.
For an application using several scoped paths through one join model, compare the identifiers in both preload orders. A query-count assertion alone cannot detect the wrong records. Related fixes cover other through-preload conditions; this example does not establish every association shape’s behavior.
Immutable strings should not erase a text type
The opt-in immutable_strings_by_default setting arrived in Rails 6.1 after its merge in 2020. It lets applications that do not mutate returned strings avoid the duplication associated with mutation detection. It defaults to false; installing a newer Rails version does not by itself enable it.
PR #59351 narrows that setting to actual string columns. Previously, types inheriting string behavior could also be converted. The upstream patch identifies text and several PostgreSQL types whose type information or specialized behavior could be lost.
In our SQLite fixture, enabling the setting made a text column report :string and return a frozen value on Rails 8.1.4. On main, it remained :text and returned a mutable value. The ordinary string column remained frozen on both. Disabling the setting preserved the text type on both. These results cover SQLite string and text columns; the PostgreSQL consequences come from source review, not a PostgreSQL execution here.
Inspect explicit uses of this setting and assert both the reported type and the mutation behavior the application expects. Do not enable it merely to obtain a new default, or infer that a successful value round trip proves that type-specific behavior survived.
Check a declared default after reset
CurrentAttributes shipped in Rails 5.2 in 2018. Its separate default: option arrived in Rails 7.2 in 2024. This week’s correction concerns attributes declared with string names.
PR #59347 normalizes CurrentAttributes names to symbols when registering defaults. A string-named attribute could have a generated reader but a default stored under the wrong key.
The synthetic declaration attribute "region", default: "Europe" returned nil on first access and after reset in Rails 8.1.4. Main returned "Europe" in both cases. A symbol-named control worked on both, including restoration of a fresh mutable default after changing the previous value.
For code declaring these attributes dynamically, test the initial read and the reset path. Explicitly assigning a value can hide the defect. This check concerns registration and reset of a synthetic value; it does not test request isolation or concurrency.
Inspect the HTML that a helper emits
Rails 5.2’s tag helper, released in 2018, already treated hidden as a boolean attribute. That treatment persists in 8.1.4. PR #59340 preserves string and symbol values for hidden, including until-found.
This complete example ran against both checked sources:
require "action_view"
helper = Object.new.extend(ActionView::Helpers::TagHelper)
puts helper.tag.div(hidden: "until-found")
Rails 8.1.4 emitted <div hidden="hidden"></div>; main emitted <div hidden="until-found"></div>. Boolean true still emitted hidden="hidden", and false omitted the attribute, on both. The fixture verifies HTML serialization, not browser reveal behavior. If a view relies on the keyword, inspect its rendered attribute and test the intended interaction separately.
What to carry into the upgrade
- Compare scoped association identifiers before and after preloading, in both relevant orders.
- Check explicit immutable-string settings against text and specialized column types.
- Exercise CurrentAttributes defaults both initially and after reset.
- Assert keyword-valued HTML attributes in rendered views.
Use the Rails upgrade review to connect those checks to the application’s next version step. Recheck the support calendar and actual released patches before choosing a deployment target.