module ZendeskAPI::Sideloading

@private

Public Class Methods

included(klass) click to toggle source
# File lib/zendesk_api/sideloading.rb, line 4
def self.included(klass)
  klass.send(:attr_reader, :included)
end

Public Instance Methods

set_includes(resource_or_resources, includes, body) click to toggle source
# File lib/zendesk_api/sideloading.rb, line 8
def set_includes(resource_or_resources, includes, body)
  @included = {}

  includes.each do |side_load|
    unless body.key?(side_load.to_s)
      @client.config.logger.warn "Missing #{side_load} key in response -- cannot side load"
    end
  end

  resources = to_array(resource_or_resources)
  resource_class = resources.first.class

  return if resources.empty?

  body.keys.each do |name|
    @included[name] = body[name]
    _side_load(name, resource_class, resources)
  end
end

Private Instance Methods

_side_load(name, klass, resources) click to toggle source

Traverses the resource looking for associations then descends into those associations and checks for applicable resources to side load

# File lib/zendesk_api/sideloading.rb, line 33
def _side_load(name, klass, resources)
  associations = klass.associated_with(name)

  associations.each do |association|
    association.side_load(resources, @included[name])
  end

  resources.each do |resource|
    loaded_associations = resource.loaded_associations
    loaded_associations.each do |association|
      loaded = resource.send(association[:name])
      next unless loaded
      _side_load(name, association[:class], to_array(loaded))
    end
  end
end
to_array(item) click to toggle source
# File lib/zendesk_api/sideloading.rb, line 50
def to_array(item)
  if item.is_a?(Collection)
    item
  else
    [item].flatten.compact
  end
end