aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test/cases/dirty_test.rb
diff options
context:
space:
mode:
authorSean Griffin <sean@thoughtbot.com>2015-01-18 13:43:31 -0700
committerSean Griffin <sean@thoughtbot.com>2015-01-18 13:43:31 -0700
commitea721d7027c16f64c47395546c67858060a273e3 (patch)
treee3eb8855e41610c491fbfd9757ae2ff7d49d45cf /activerecord/test/cases/dirty_test.rb
parentc542677310b7dbb205cf3bc24f74099ae929ca20 (diff)
downloadrails-ea721d7027c16f64c47395546c67858060a273e3.tar.gz
rails-ea721d7027c16f64c47395546c67858060a273e3.tar.bz2
rails-ea721d7027c16f64c47395546c67858060a273e3.zip
Don't calculate in-place changes on attribute assignment
When an attribute is assigned, we determine if it was already marked as changed so we can determine if we need to clear the changes, or mark it as changed. Since this only affects the `attributes_changed_by_setter` hash, in-place changes are irrelevant to this process. Since calculating in-place changes can be expensive, we can just skip it here. I also added a test for the only edge case I could think of that would be affected by this change.
Diffstat (limited to 'activerecord/test/cases/dirty_test.rb')
-rw-r--r--activerecord/test/cases/dirty_test.rb8
1 files changed, 8 insertions, 0 deletions
diff --git a/activerecord/test/cases/dirty_test.rb b/activerecord/test/cases/dirty_test.rb
index ae4a8aab2c..192ba6f7cd 100644
--- a/activerecord/test/cases/dirty_test.rb
+++ b/activerecord/test/cases/dirty_test.rb
@@ -721,6 +721,14 @@ class DirtyTest < ActiveRecord::TestCase
assert record.save
end
+ test "mutating and then assigning doesn't remove the change" do
+ pirate = Pirate.create!(catchphrase: "arrrr")
+ pirate.catchphrase << " matey!"
+ pirate.catchphrase = "arrrr matey!"
+
+ assert pirate.catchphrase_changed?(from: "arrrr", to: "arrrr matey!")
+ end
+
private
def with_partial_writes(klass, on = true)
old = klass.partial_writes?