diff options
author | Eugene Kenny <elkenny@gmail.com> | 2018-04-08 23:06:48 +0100 |
---|---|---|
committer | Eugene Kenny <elkenny@gmail.com> | 2018-04-08 23:06:48 +0100 |
commit | 80a09caedc6fa67f95e78e45e7eb954f6b647b2c (patch) | |
tree | 1f5cfd6dbbb1dc0d71adec1806770ba7085bf284 /activerecord/test/cases/dirty_test.rb | |
parent | d729bc748811339c7e536f4ca98e91801e14c6f4 (diff) | |
download | rails-80a09caedc6fa67f95e78e45e7eb954f6b647b2c.tar.gz rails-80a09caedc6fa67f95e78e45e7eb954f6b647b2c.tar.bz2 rails-80a09caedc6fa67f95e78e45e7eb954f6b647b2c.zip |
Prevent changes_to_save from mutating attributes
When an array of hashes is added to a `HashWithIndifferentAccess`, the
hashes are replaced with HWIAs by mutating the array in place.
If an attribute's value is an array of hashes, `changes_to_save` will
convert it to an array of HWIAs as a side-effect of adding it to the
changes hash.
Using `merge!` instead of `[]=` fixes the problem, as `merge!` copies
any array values in the provided hash instead of mutating them.
Diffstat (limited to 'activerecord/test/cases/dirty_test.rb')
-rw-r--r-- | activerecord/test/cases/dirty_test.rb | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/activerecord/test/cases/dirty_test.rb b/activerecord/test/cases/dirty_test.rb index 2f1434b2bc..5c7f70b7a0 100644 --- a/activerecord/test/cases/dirty_test.rb +++ b/activerecord/test/cases/dirty_test.rb @@ -473,6 +473,14 @@ class DirtyTest < ActiveRecord::TestCase end end + def test_changes_to_save_should_not_mutate_array_of_hashes + topic = Topic.new(author_name: "Bill", content: [{ a: "a" }]) + + topic.changes_to_save + + assert_equal [{ a: "a" }], topic.content + end + def test_previous_changes # original values should be in previous_changes pirate = Pirate.new |