Sha256: ee94691bbefa14ce1f8b85f57b55aec787ed70dec3f1a424dfaec391032c262a

Contents?: true

Size: 1.91 KB

Versions: 1

Compression:

Stored size: 1.91 KB

Contents

module AxleAttributes
  module Serializations
    class Serialization
      attr_accessor :owner, :reflection
      def initialize(owner, reflection)
        @owner      = owner
        @reflection = reflection
        @collection = nil
        @loaded     = false
      end

      def name
        reflection.name
      end

      def writer(value)
        raise "writer must be implemented"
      end

      def reader
        target
      end

      def reader_was
        if owner.changed_attributes.include?(name.to_s)
          instantiate_target_with_self owner.changed_attributes[name.to_s]
        else
          target
        end
      end

      def loaded?
        @loaded
      end

      protected

        def target=(value)
          @target = value
          target_with_serialization_instance(@target)
          loaded!
          owner[reflection.storage_column] = mutate_json_times!(value.as_json)
        end

        def mutate_json_times!(json)
          Array.wrap(json).each do |attrs|
            attrs.each do |k, v|
              if v.acts_like?(:time) || v.acts_like?(:date)
                attrs[k] = v.as_json
              end
            end
          end

          json
        end

        def target
          unless loaded?
            @target = load_target
            loaded!
          end

          @target
        end

        def loaded!
          @loaded = true
        end

        def load_target
          instantiate_target_with_self owner[reflection.storage_column]
        end

        def instantiate_target_with_self(json)
          target_with_serialization_instance instantiate_target(json)
        end

        def target_with_serialization_instance(target)
          Array.wrap(target).each { |record| record.serialization_instance = self }
          target
        end

        def instantiate_target(json)
          raise "instantiate_target must be implemented"
        end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
axle_attributes-1.13.2 lib/axle_attributes/serializations/serialization.rb