From 912904caee1e037e2f71d6ede35a3758c15f276d Mon Sep 17 00:00:00 2001 From: Sean Griffin Date: Thu, 29 May 2014 13:34:23 -0700 Subject: Move `type_cast_for_write` behavior over to the serialized type object --- .../attribute_methods/serialization.rb | 39 ++-------------------- .../lib/active_record/attribute_methods/write.rb | 17 ++++------ 2 files changed, 8 insertions(+), 48 deletions(-) (limited to 'activerecord/lib/active_record/attribute_methods') diff --git a/activerecord/lib/active_record/attribute_methods/serialization.rb b/activerecord/lib/active_record/attribute_methods/serialization.rb index e8c27cb8b8..65d910fd46 100644 --- a/activerecord/lib/active_record/attribute_methods/serialization.rb +++ b/activerecord/lib/active_record/attribute_methods/serialization.rb @@ -62,7 +62,7 @@ module ActiveRecord if type.serialized? type = type.subtype end - property attr_name, ActiveRecord::Type::Serialized.new(type) + property attr_name, Type::Serialized.new(type, coder) # merge new serialized attribute and create new hash to ensure that each class in inheritance hierarchy # has its own hash of own serialized attributes @@ -70,25 +70,6 @@ module ActiveRecord end end - class Attribute < Struct.new(:coder, :value, :state) # :nodoc: - def unserialized_value(v = value) - state == :serialized ? unserialize(v) : value - end - - def serialized_value - state == :unserialized ? serialize : value - end - - def unserialize(v) - self.state = :unserialized - self.value = coder.load(v) - end - - def serialize - self.state = :serialized - self.value = coder.dump(value) - end - end # This is only added to the model when serialize is called, which # ensures we do not make things slower when serialization is not used. @@ -102,7 +83,7 @@ module ActiveRecord serialized_attributes.each do |key, coder| if attributes.key?(key) - attributes[key] = Attribute.new(coder, attributes[key], serialized) + attributes[key] = Type::Serialized::Attribute.new(coder, attributes[key], serialized) end end @@ -118,22 +99,6 @@ module ActiveRecord super | (attributes.keys & self.class.serialized_attributes.keys) end - def type_cast_attribute_for_write(column, value) - if column && coder = self.class.serialized_attributes[column.name] - Attribute.new(coder, value, :unserialized) - else - super - end - end - - def raw_type_cast_attribute_for_write(column, value) - if column && coder = self.class.serialized_attributes[column.name] - Attribute.new(coder, value, :serialized) - else - super - end - end - def _field_changed?(attr, old, value) if self.class.serialized_attributes.include?(attr) old != value diff --git a/activerecord/lib/active_record/attribute_methods/write.rb b/activerecord/lib/active_record/attribute_methods/write.rb index 56441d7324..d552bea8c4 100644 --- a/activerecord/lib/active_record/attribute_methods/write.rb +++ b/activerecord/lib/active_record/attribute_methods/write.rb @@ -55,11 +55,11 @@ module ActiveRecord # specified +value+. Empty strings for fixnum and float columns are # turned into +nil+. def write_attribute(attr_name, value) - write_attribute_with_type_cast(attr_name, value, :type_cast_attribute_for_write) + write_attribute_with_type_cast(attr_name, value, :type_cast_for_write) end def raw_write_attribute(attr_name, value) - write_attribute_with_type_cast(attr_name, value, :raw_type_cast_attribute_for_write) + write_attribute_with_type_cast(attr_name, value, :raw_type_cast_for_write) end private @@ -68,13 +68,6 @@ module ActiveRecord write_attribute(attribute_name, value) end - def type_cast_attribute_for_write(column, value) - return value unless column - - column.type_cast_for_write value - end - alias_method :raw_type_cast_attribute_for_write, :type_cast_attribute_for_write - def write_attribute_with_type_cast(attr_name, value, type_cast_method) attr_name = attr_name.to_s attr_name = self.class.primary_key if attr_name == 'id' && self.class.primary_key @@ -87,8 +80,10 @@ module ActiveRecord @attributes_cache[attr_name] = value end - if column || @attributes.has_key?(attr_name) - @attributes[attr_name] = send(type_cast_method, column, value) + if column + @attributes[attr_name] = column.public_send(type_cast_method, value) + elsif @attributes.has_key?(attr_name) + @attributes[attr_name] = value else raise ActiveModel::MissingAttributeError, "can't write unknown attribute `#{attr_name}'" end -- cgit v1.2.3