Inconsistent in-memory attribute serialization after update! depending on legacy_attributes setting

XMLWordPrintableJSON

    • Type: Bug
    • Resolution: Unresolved
    • Priority: Unknown
    • None
    • Affects Version/s: None
    • Component/s: Rails
    • None
    • None
    • Ruby Drivers
    • None
    • None
    • None
    • None
    • None
    • None

      When updating a field containing an array of hashes using `update!`, the in-memory representation of the updated value differs depending on the `legacy_attributes` configuration.

      Specifically:

      • `legacy_attributes=true`: the updated value appears immediately in a normalized (string-keyed) form.
      • `legacy_attributes=false`: symbol keys are retained in memory.

      Is this an intended change?

      Steps to Reproduce:

      class Request
        include Mongoid::Document
        field :params, type: Array
      end

      In Rails console

      Request.create!
      req = Request.first
      
      # Legacy attributes: false
      req.update!(params: [{ date_from: "2025-05-01", date_to: "2025-05-31" }, 1, 100])
      req.params
      => [{:date_from=>"2025-05-01", :date_to=>"2025-05-31"}, 1, 100] # Symbol key
      
      # Legacy attributes: true
      req.update!(params: [{ date_from: "2025-05-01", date_to: "2025-05-31" }, 1, 100])
      req.params
      => [{"date_from"=>"2025-05-01", "date_to"=>"2025-05-31"}, 1, 100] # String key

      Observed Behavior:


      • With legacy_attributes: false, the updated value in memory retains symbol keys and reflects the exact structure passed to update!.
      • With legacy_attributes: true, the updated value in memory is immediately normalized to string keys — as though the document had been reloaded from the database. This suggests an implicit reload or internal refresh of attributes is occurring.

      Expected Behavior:

      • We expect that the in-memory representation of updated attributes remains consistent regardless of the legacy_attributes setting.
      • We expect that values passed to update! are consistently normalized (mongoized) before being returned through accessors like `req.params`.

      Environment:

      • Mongoid version: 8.1.10
      • MongoDB version: 7.0.11
      • mongo-ruby-driver version: 2.21.0
      • Ruby version: 3.3.6
      • Rails version: 7.2.2.1

            Assignee:
            Unassigned
            Reporter:
            Jin Oketani
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated: