serialized.rb 1.3 KB
Newer Older
1 2
module ActiveRecord
  module Type
3 4
    class Serialized < DelegateClass(ActiveModel::Type::Value) # :nodoc:
      include ActiveModel::Type::Helpers::Mutable
5

6
      attr_reader :subtype, :coder
7

8
      def initialize(subtype, coder)
9
        @subtype = subtype
10 11
        @coder = coder
        super(subtype)
12 13
      end

14
      def deserialize(value)
15
        if default_value?(value)
16
          value
17
        else
18
          coder.load(super)
19 20 21
        end
      end

22
      def serialize(value)
23
        return if value.nil?
24
        unless default_value?(value)
25
          super coder.dump(value)
26
        end
27 28
      end

29 30 31 32
      def inspect
        Kernel.instance_method(:inspect).bind(self).call
      end

33 34
      def changed_in_place?(raw_old_value, value)
        return false if value.nil?
35 36 37
        raw_new_value = serialize(value)
        raw_old_value.nil? != raw_new_value.nil? ||
          subtype.changed_in_place?(raw_old_value, raw_new_value)
38 39
      end

40 41 42
      def accessor
        ActiveRecord::Store::IndifferentHashAccessor
      end
43

44 45 46 47 48 49
      def assert_valid_value(value)
        if coder.respond_to?(:assert_valid_value)
          coder.assert_valid_value(value)
        end
      end

50
      private
51

52
      def default_value?(value)
53
        value == coder.load(nil)
54
      end
55 56 57
    end
  end
end