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