serialized.rb 967 字节
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 type_cast_from_database(value)
15
        if default_value?(value)
16
          value
17
        else
18
          coder.load(super)
19 20 21
        end
      end

22
      def type_cast_for_database(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
        subtype.changed_in_place?(raw_old_value, type_cast_for_database(value))
32 33
      end

34 35 36
      def accessor
        ActiveRecord::Store::IndifferentHashAccessor
      end
37

38
      private
39

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