aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/type/serialized.rb
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord/lib/active_record/type/serialized.rb')
-rw-r--r--activerecord/lib/active_record/type/serialized.rb38
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