diff options
author | Will Bryant <will.bryant@gmail.com> | 2017-05-09 22:04:22 +1200 |
---|---|---|
committer | Will Bryant <will.bryant@gmail.com> | 2017-05-10 11:23:33 +1200 |
commit | ba2190b3b6e506d7e5cede710594b22f9d937f39 (patch) | |
tree | 6cb03039d9a5bea65099248e9a49040cf6fc797a | |
parent | 943efa30f5475f51fe90df5f85703d191dbd7d6e (diff) | |
download | rails-ba2190b3b6e506d7e5cede710594b22f9d937f39.tar.gz rails-ba2190b3b6e506d7e5cede710594b22f9d937f39.tar.bz2 rails-ba2190b3b6e506d7e5cede710594b22f9d937f39.zip |
fix the dirty tracking code's save hook overwriting missing attributes with initialized-to-nil attributes. fixes #29017.
-rw-r--r-- | activerecord/lib/active_record/attribute.rb | 4 | ||||
-rw-r--r-- | activerecord/test/cases/dirty_test.rb | 7 |
2 files changed, 11 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/attribute.rb b/activerecord/lib/active_record/attribute.rb index 38281158d8..5b4e967e94 100644 --- a/activerecord/lib/active_record/attribute.rb +++ b/activerecord/lib/active_record/attribute.rb @@ -231,6 +231,10 @@ module ActiveRecord false end + def forgetting_assignment + dup + end + def with_type(type) self.class.new(name, type) end diff --git a/activerecord/test/cases/dirty_test.rb b/activerecord/test/cases/dirty_test.rb index 721861975a..1fc78f8d32 100644 --- a/activerecord/test/cases/dirty_test.rb +++ b/activerecord/test/cases/dirty_test.rb @@ -775,6 +775,13 @@ class DirtyTest < ActiveRecord::TestCase assert person.changed? end + test "attributes not selected are still missing after save" do + person = Person.select(:id).first + assert_raises(ActiveModel::MissingAttributeError) { person.first_name } + assert person.save # calls forget_attribute_assignments + assert_raises(ActiveModel::MissingAttributeError) { person.first_name } + end + test "saved_change_to_attribute? returns whether a change occurred in the last save" do person = Person.create!(first_name: "Sean") |