Class: Graphiti::Sideload::PolymorphicBelongsTo

Inherits:
BelongsTo show all
Defined in:
lib/graphiti/sideload/polymorphic_belongs_to.rb

Defined Under Namespace

Classes: Group, Grouper

Constant Summary

Constants inherited from Graphiti::Sideload

HOOK_ACTIONS, TYPES

Instance Attribute Summary collapse

Attributes inherited from Graphiti::Sideload

#group_name, #link, #name, #parent, #parent_resource_class, #polymorphic_as

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from BelongsTo

#base_filter, #default_include_resource_ids?, #foreign_key_is_related_id?, #ids_for_parents, #linkage_from_foreign_key?, #load_params

Methods inherited from Graphiti::Sideload

after_save, #always_include_resource_ids?, assign, #assign, assign_each, #assign_each, #associate, #associate_all, #association_name, #base_scope, #build_resource_proxy, #clear_resources, #create_remote_resource, #default_include_resource_ids?, #description, #disassociate, #errors, #fire_hooks!, #foreign_key, #guarded?, hooks, #ids_for_parents, link, #link?, #link_extra_fields, #link_filter, #linkage_from_foreign_key?, #load, #load_params, params, #parent_resource, #performant_assign?, #polymorphic_child?, #polymorphic_has_many?, #polymorphic_has_one?, #polymorphic_parent?, pre_load, #primary_key, #readable?, #remote?, #resource, #resource_class, #resource_class_loaded?, scope, #scope, #shared_remote?, #single?, #writable?

Constructor Details

#initialize(name, opts) ⇒ PolymorphicBelongsTo

Returns a new instance of PolymorphicBelongsTo.



89
90
91
92
93
# File 'lib/graphiti/sideload/polymorphic_belongs_to.rb', line 89

def initialize(name, opts)
  super
  self.children = {}
  grouper.apply(self, parent_resource_class)
end

Instance Attribute Details

#childrenObject

Returns the value of attribute children.



73
74
75
# File 'lib/graphiti/sideload/polymorphic_belongs_to.rb', line 73

def children
  @children
end

Class Method Details

.group_by(name, opts = {}, &blk) ⇒ Object



84
85
86
87
# 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

Instance Method Details

#child_for_type(type) ⇒ Object



95
96
97
98
99
# 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) ⇒ Object



101
102
103
104
105
106
107
108
# 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

#future_resolve(parents, query, graph_parent) ⇒ Object



118
119
120
121
122
123
124
# File 'lib/graphiti/sideload/polymorphic_belongs_to.rb', line 118

def future_resolve(parents, query, graph_parent)
  promises = []
  each_resolvable_group(parents, query) do |child, group, child_query|
    promises << child.future_resolve(group, child_query, graph_parent)
  end
  Concurrent::Promises.zip(*promises)
end

#infer_foreign_keyObject



80
81
82
# File 'lib/graphiti/sideload/polymorphic_belongs_to.rb', line 80

def infer_foreign_key
  :"#{name}_id"
end

#resolve(parents, query, graph_parent) ⇒ Object



110
111
112
113
114
115
116
# File 'lib/graphiti/sideload/polymorphic_belongs_to.rb', line 110

def resolve(parents, query, graph_parent)
  if Graphiti.config.concurrency
    future_resolve(parents, query, graph_parent).value!
  else
    sync_resolve(parents, query, graph_parent)
  end
end

#typeObject



76
77
78
# File 'lib/graphiti/sideload/polymorphic_belongs_to.rb', line 76

def type
  :polymorphic_belongs_to
end