diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2018-05-19 11:46:03 +0900 |
---|---|---|
committer | Ryuta Kamizono <kamipo@gmail.com> | 2019-04-16 12:30:45 +0900 |
commit | 63ff495bdf90e0ab20114a49db5cffe3cb9ef2fd (patch) | |
tree | 33d5e390a602ef7c77a2c675865b573802fdd35b /activerecord/lib/active_record/attribute_methods/read.rb | |
parent | 20b94af9eb9305d19a343f72f0afb18eb49e2de7 (diff) | |
download | rails-63ff495bdf90e0ab20114a49db5cffe3cb9ef2fd.tar.gz rails-63ff495bdf90e0ab20114a49db5cffe3cb9ef2fd.tar.bz2 rails-63ff495bdf90e0ab20114a49db5cffe3cb9ef2fd.zip |
Fix dirty tracking after rollback.
Currently the rollback only restores primary key value, `new_record?`,
`destroyed?`, and `frozen?`. Since the `save` clears current dirty
attribute states, retrying save after rollback will causes no change
saved if partial writes is enabled (by default).
This makes `remember_transaction_record_state` remembers original values
then restores dirty attribute states after rollback.
Fixes #15018.
Fixes #30167.
Fixes #33868.
Fixes #33443.
Closes #33444.
Closes #34504.
Diffstat (limited to 'activerecord/lib/active_record/attribute_methods/read.rb')
-rw-r--r-- | activerecord/lib/active_record/attribute_methods/read.rb | 5 |
1 files changed, 1 insertions, 4 deletions
diff --git a/activerecord/lib/active_record/attribute_methods/read.rb b/activerecord/lib/active_record/attribute_methods/read.rb index ffac5313ad..84b1ec2fea 100644 --- a/activerecord/lib/active_record/attribute_methods/read.rb +++ b/activerecord/lib/active_record/attribute_methods/read.rb @@ -9,14 +9,11 @@ module ActiveRecord private def define_method_attribute(name) - sync_with_transaction_state = "sync_with_transaction_state" if name == primary_key - ActiveModel::AttributeMethods::AttrNames.define_attribute_accessor_method( generated_attribute_methods, name ) do |temp_method_name, attr_name_expr| generated_attribute_methods.module_eval <<-RUBY, __FILE__, __LINE__ + 1 def #{temp_method_name} - #{sync_with_transaction_state} name = #{attr_name_expr} _read_attribute(name) { |n| missing_attribute(n, caller) } end @@ -36,13 +33,13 @@ module ActiveRecord primary_key = self.class.primary_key name = primary_key if name == "id" && primary_key - sync_with_transaction_state if name == primary_key _read_attribute(name, &block) end # This method exists to avoid the expensive primary_key check internally, without # breaking compatibility with the read_attribute API def _read_attribute(attr_name, &block) # :nodoc + sync_with_transaction_state @attributes.fetch_value(attr_name.to_s, &block) end |