Sha256: 54a63e9c2ded588169f9489e5269cbb1c1f7b099780a228f5c80ba7ac7d21c45

Contents?: true

Size: 1.72 KB

Versions: 1

Compression:

Stored size: 1.72 KB

Contents

# For "Rails STI" behavior
# CreditCard.all # => [<Visa>, <Mastercard>, etc]
module JsonapiCompliable
  class Resource
    module Polymorphism
      def self.prepended(klass)
        klass.extend ClassMethods
      end

      def serializer_for(model)
        if polymorphic_child?
          serializer
        else
          child = self.class.resource_for_model(model)
          child.serializer
        end
      end

      def associate_all(parent, children, association_name, type)
        children.each do |c|
          associate(parent, c, association_name, type)
        end
      end

      def associate(parent, child, association_name, type)
        child_resource = self.class.resource_for_model(parent)
        if child_resource.sideloads[association_name]
          child_resource.adapter
            .associate(parent, child, association_name, type)
        end
      end

      module ClassMethods
        def inherited(klass)
          klass.type = nil
          klass.model = klass.infer_model
          klass.polymorphic_child = true
          super
        end

        def sideload(name)
          sl = super
          if !polymorphic_child? && sl.nil?
            children.each do |c|
              break if sl = c.sideloads[name]
            end
          end
          sl
        end

        def children
          @children ||= polymorphic.map do |klass|
            klass.is_a?(String) ? klass.safe_constantize : klass
          end
        end

        def resource_for_model(model)
          resource = children.find { |c| model.is_a?(c.model) }
          if resource.nil?
            raise Errors::PolymorphicChildNotFound.new(self, model)
          else
            resource
          end
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
jsonapi_compliable-1.0.alpha.2 lib/jsonapi_compliable/resource/polymorphism.rb