class Graphiti::Sideload::PolymorphicBelongsTo

Attributes

children[RW]

Public Class Methods

group_by(name, opts = {}, &blk) click to toggle source
# File lib/graphiti/sideload/polymorphic_belongs_to.rb, line 84
def self.group_by(name, opts = {}, &blk)
  self.grouper = Grouper.new(name, opts)
  grouper.instance_eval(&blk)
end
new(name, opts) click to toggle source
Calls superclass method Graphiti::Sideload::BelongsTo::new
# File lib/graphiti/sideload/polymorphic_belongs_to.rb, line 89
def initialize(name, opts)
  super
  self.children = {}
  grouper.apply(self, parent_resource_class)
end

Public Instance Methods

child_for_type(type) click to toggle source
# File lib/graphiti/sideload/polymorphic_belongs_to.rb, line 95
def child_for_type(type)
  children.values.find do |sideload|
    sideload.resource.type == type
  end
end
child_for_type!(type) click to toggle source
# File lib/graphiti/sideload/polymorphic_belongs_to.rb, line 101
def child_for_type!(type)
  if (child = child_for_type(type))
    child
  else
    err = ::Graphiti::Errors::PolymorphicSideloadTypeNotFound
    raise err.new(self, type)
  end
end
infer_foreign_key() click to toggle source
# File lib/graphiti/sideload/polymorphic_belongs_to.rb, line 80
def infer_foreign_key
  :"#{name}_id"
end
resolve(parents, query, graph_parent) click to toggle source
# File lib/graphiti/sideload/polymorphic_belongs_to.rb, line 110
def resolve(parents, query, graph_parent)
  parents.group_by(&grouper.field_name).each_pair do |group_name, group|
    next if group_name.nil? || grouper.ignore?(group_name)

    match = ->(c) { c.group_name == group_name.to_sym }
    if (sideload = children.values.find(&match))
      duped = remove_invalid_sideloads(sideload.resource, query)
      sideload.resolve(group, duped, graph_parent)
    else
      err = ::Graphiti::Errors::PolymorphicSideloadChildNotFound
      raise err.new(self, group_name)
    end
  end
end
type() click to toggle source
# File lib/graphiti/sideload/polymorphic_belongs_to.rb, line 76
def type
  :polymorphic_belongs_to
end

Private Instance Methods

remove_invalid_sideloads(resource, query) click to toggle source

We may be requesting a relationship that some subclasses support, but not others. Remove anything we don’t support. TODO: spec to ensure this dupe logic doesn’t mutate the original

# File lib/graphiti/sideload/polymorphic_belongs_to.rb, line 130
def remove_invalid_sideloads(resource, query)
  duped = query.dup
  duped.instance_variable_set(:@hash, nil)
  duped.instance_variable_set(:@sideloads, ::Graphiti::Util::Hash.deep_dup(query.sideloads))
  duped.sideloads.each_pair do |key, value|
    unless resource.class.sideload(key)
      duped.sideloads.delete(key)
    end
  end
  duped
end