serialized.rb 1.3 KB
Newer Older
1 2 3
module ActiveRecord
  module Type
    class Serialized < SimpleDelegator # :nodoc:
4
      attr_reader :subtype, :coder
5

6
      def initialize(subtype, coder)
7
        @subtype = subtype
8 9
        @coder = coder
        super(subtype)
10 11 12 13 14 15 16 17 18 19
      end

      def type_cast(value)
        if value.respond_to?(:unserialized_value)
          value.unserialized_value(super(value.value))
        else
          super
        end
      end

20 21 22 23 24 25 26 27
      def type_cast_for_write(value)
        Attribute.new(coder, value, :unserialized)
      end

      def raw_type_cast_for_write(value)
        Attribute.new(coder, value, :serialized)
      end

28 29 30 31 32 33 34
      def serialized?
        true
      end

      def accessor
        ActiveRecord::Store::IndifferentHashAccessor
      end
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54

      class Attribute < Struct.new(:coder, :value, :state) # :nodoc:
        def unserialized_value(v = value)
          state == :serialized ? unserialize(v) : value
        end

        def serialized_value
          state == :unserialized ? serialize : value
        end

        def unserialize(v)
          self.state = :unserialized
          self.value = coder.load(v)
        end

        def serialize
          self.state = :serialized
          self.value = coder.dump(value)
        end
      end
55 56 57
    end
  end
end