serialized.rb 1021 字节
Newer Older
1 2
module ActiveRecord
  module Type
3
    class Serialized < DelegateClass(Type::Value) # :nodoc:
4
      include 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
      def changed_in_place?(raw_old_value, value)
        return false if value.nil?
31 32 33
        raw_new_value = serialize(value)
        raw_old_value.nil? != raw_new_value.nil? ||
          subtype.changed_in_place?(raw_old_value, raw_new_value)
34 35
      end

36 37 38
      def accessor
        ActiveRecord::Store::IndifferentHashAccessor
      end
39

40
      private
41

42
      def default_value?(value)
43
        value == coder.load(nil)
44
      end
45 46 47
    end
  end
end