diff options
Diffstat (limited to 'activerecord/lib/active_record/type/serialized.rb')
-rw-r--r-- | activerecord/lib/active_record/type/serialized.rb | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/activerecord/lib/active_record/type/serialized.rb b/activerecord/lib/active_record/type/serialized.rb index 42bbed7103..4ff0740cfb 100644 --- a/activerecord/lib/active_record/type/serialized.rb +++ b/activerecord/lib/active_record/type/serialized.rb @@ -1,7 +1,7 @@ module ActiveRecord module Type - class Serialized < SimpleDelegator # :nodoc: - include Mutable + class Serialized < DelegateClass(ActiveModel::Type::Value) # :nodoc: + include ActiveModel::Type::Helpers::Mutable attr_reader :subtype, :coder @@ -11,39 +11,45 @@ module ActiveRecord super(subtype) end - def type_cast_from_database(value) - if is_default_value?(value) + def deserialize(value) + if default_value?(value) value else coder.load(super) end end - def type_cast_for_database(value) + def serialize(value) return if value.nil? - unless is_default_value?(value) + unless default_value?(value) super coder.dump(value) end end - def accessor - ActiveRecord::Store::IndifferentHashAccessor + def inspect + Kernel.instance_method(:inspect).bind(self).call end - def init_with(coder) - @subtype = coder['subtype'] - @coder = coder['coder'] - __setobj__(@subtype) + def changed_in_place?(raw_old_value, value) + return false if value.nil? + raw_new_value = serialize(value) + raw_old_value.nil? != raw_new_value.nil? || + subtype.changed_in_place?(raw_old_value, raw_new_value) end - def encode_with(coder) - coder['subtype'] = @subtype - coder['coder'] = @coder + def accessor + ActiveRecord::Store::IndifferentHashAccessor + end + + def assert_valid_value(value) + if coder.respond_to?(:assert_valid_value) + coder.assert_valid_value(value) + end end private - def is_default_value?(value) + def default_value?(value) value == coder.load(nil) end end |