class JsonapiCompliable::Util::RelationshipPayload

Helper methods for traversing the 'relationships' JSONAPI payloads @api private

Attributes

payload[R]
resource[R]

Public Class Methods

iterate(resource:, relationships: {}, only: [], except: []) { |sideload, relationship_data, sub_relationships| ... } click to toggle source
# File lib/jsonapi_compliable/util/relationship_payload.rb, line 8
def self.iterate(resource:, relationships: {}, only: [], except: [])
  instance = new(resource, relationships, only: only, except: except)
  instance.iterate do |sideload, relationship_data, sub_relationships|
    yield sideload, relationship_data, sub_relationships
  end
end
new(resource, payload, only: [], except: []) click to toggle source
# File lib/jsonapi_compliable/util/relationship_payload.rb, line 15
def initialize(resource, payload, only: [], except: [])
  @resource = resource
  @payload  = payload
  @only     = only
  @except   = except
end

Public Instance Methods

iterate() { |payload_for(sl, rp)| ... } click to toggle source
# File lib/jsonapi_compliable/util/relationship_payload.rb, line 22
def iterate
  payload.each_pair do |relationship_name, relationship_payload|
    if sl = resource.sideload(relationship_name.to_sym)
      if should_yield?(sl.type)
        if relationship_payload.is_a?(Array)
          relationship_payload.each do |rp|
            yield payload_for(sl, rp)
          end
        else
          yield payload_for(sl, relationship_payload)
        end
      end
    end
  end
end

Private Instance Methods

payload_for(sideload, relationship_payload) click to toggle source
# File lib/jsonapi_compliable/util/relationship_payload.rb, line 45
def payload_for(sideload, relationship_payload)
  if sideload.polymorphic?
    type     = relationship_payload[:meta][:jsonapi_type]
    sideload = sideload.polymorphic_child_for_type(type)
  end
  relationship_payload[:meta][:method] ||= :update

  {
    sideload: sideload,
    is_polymorphic: !sideload.parent.nil?,
    primary_key: sideload.primary_key,
    foreign_key: sideload.foreign_key,
    attributes: relationship_payload[:attributes],
    meta: relationship_payload[:meta],
    relationships: relationship_payload[:relationships]
  }
end
should_yield?(type) click to toggle source
# File lib/jsonapi_compliable/util/relationship_payload.rb, line 40
def should_yield?(type)
  (@only.length > 0 && @only.include?(type)) ||
    (@except.length > 0 && !@except.include?(type))
end