class Graphiti::Sideload::PolymorphicBelongsTo
Attributes
Public Class Methods
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
Source
# File lib/graphiti/sideload/polymorphic_belongs_to.rb, line 89 def initialize(name, opts) super self.children = {} grouper.apply(self, parent_resource_class) end
Calls superclass method
Graphiti::Sideload::BelongsTo::new
Public Instance Methods
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
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
Source
# File lib/graphiti/sideload/polymorphic_belongs_to.rb, line 114 def future_resolve(parents, query, graph_parent) promises = parents.group_by(&grouper.field_name).filter_map 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.future_resolve(group, duped, graph_parent) else err = ::Graphiti::Errors::PolymorphicSideloadChildNotFound raise err.new(self, group_name) end end Concurrent::Promises.zip(*promises) end
Source
# File lib/graphiti/sideload/polymorphic_belongs_to.rb, line 80 def infer_foreign_key :"#{name}_id" end
Source
# File lib/graphiti/sideload/polymorphic_belongs_to.rb, line 110 def resolve(parents, query, graph_parent) future_resolve(parents, query, graph_parent).value! end
Source
# File lib/graphiti/sideload/polymorphic_belongs_to.rb, line 76 def type :polymorphic_belongs_to end
Private Instance Methods
Source
# File lib/graphiti/sideload/polymorphic_belongs_to.rb, line 135 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
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