aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Mendonça França <rafaelmfranca@gmail.com>2014-06-16 14:28:32 -0300
committerRafael Mendonça França <rafaelmfranca@gmail.com>2014-06-16 14:28:32 -0300
commit78ae3a30f0323c9c77561e8cd35d8f94e6daa111 (patch)
tree4870b510baedfb3e4dcda8846ee1010caa59ab8c
parent1aa059c680234322476f9cb5ca4dc65d740549db (diff)
parent218105f58e30bc9487ad59fa455878c35262a0a5 (diff)
downloadrails-78ae3a30f0323c9c77561e8cd35d8f94e6daa111.tar.gz
rails-78ae3a30f0323c9c77561e8cd35d8f94e6daa111.tar.bz2
rails-78ae3a30f0323c9c77561e8cd35d8f94e6daa111.zip
Merge pull request #15755 from sgrif/sg-dirty-refactor
Refactor in-place dirty checking to use the attribute object
-rw-r--r--activerecord/lib/active_record/attribute.rb19
-rw-r--r--activerecord/lib/active_record/attribute_methods/dirty.rb12
-rw-r--r--activerecord/lib/active_record/attribute_methods/read.rb4
3 files changed, 26 insertions, 9 deletions
diff --git a/activerecord/lib/active_record/attribute.rb b/activerecord/lib/active_record/attribute.rb
index f78cde23c5..8604ccb90d 100644
--- a/activerecord/lib/active_record/attribute.rb
+++ b/activerecord/lib/active_record/attribute.rb
@@ -29,6 +29,14 @@ module ActiveRecord
type.type_cast_for_database(value)
end
+ def changed_from?(old_value)
+ type.changed?(old_value, value, value_before_type_cast)
+ end
+
+ def changed_in_place_from?(old_value)
+ type.changed_in_place?(old_value, value)
+ end
+
def type_cast
raise NotImplementedError
end
@@ -52,5 +60,16 @@ module ActiveRecord
type.type_cast_from_user(value)
end
end
+
+ class Null
+ class << self
+ attr_reader :value, :value_before_type_cast, :value_for_database
+
+ def changed_from?(*)
+ false
+ end
+ alias changed_in_place_from? changed_from?
+ end
+ end
end
end
diff --git a/activerecord/lib/active_record/attribute_methods/dirty.rb b/activerecord/lib/active_record/attribute_methods/dirty.rb
index 6a5c057384..9d1310b576 100644
--- a/activerecord/lib/active_record/attribute_methods/dirty.rb
+++ b/activerecord/lib/active_record/attribute_methods/dirty.rb
@@ -137,9 +137,7 @@ module ActiveRecord
end
def _field_changed?(attr, old_value)
- new_value = read_attribute(attr)
- raw_value = read_attribute_before_type_cast(attr)
- column_for_attribute(attr).changed?(old_value, new_value, raw_value)
+ attribute_named(attr).changed_from?(old_value)
end
def changed_in_place
@@ -149,10 +147,8 @@ module ActiveRecord
end
def changed_in_place?(attr_name)
- type = type_for_attribute(attr_name)
old_value = original_raw_attribute(attr_name)
- value = read_attribute(attr_name)
- type.changed_in_place?(old_value, value)
+ attribute_named(attr_name).changed_in_place_from?(old_value)
end
def original_raw_attribute(attr_name)
@@ -166,9 +162,7 @@ module ActiveRecord
end
def store_original_raw_attribute(attr_name)
- type = type_for_attribute(attr_name)
- value = type.type_cast_for_database(read_attribute(attr_name))
- original_raw_attributes[attr_name] = value
+ original_raw_attributes[attr_name] = attribute_named(attr_name).value_for_database
end
def store_original_raw_attributes
diff --git a/activerecord/lib/active_record/attribute_methods/read.rb b/activerecord/lib/active_record/attribute_methods/read.rb
index 8c1cc128f7..525c46970a 100644
--- a/activerecord/lib/active_record/attribute_methods/read.rb
+++ b/activerecord/lib/active_record/attribute_methods/read.rb
@@ -99,6 +99,10 @@ module ActiveRecord
def attribute(attribute_name)
read_attribute(attribute_name)
end
+
+ def attribute_named(attribute_name)
+ @attributes.fetch(attribute_name, Attribute::Null)
+ end
end
end
end