Module: Graphiti::Resource::Sideloading::ClassMethods
- Defined in:
- lib/graphiti/resource/sideloading.rb
Instance Method Summary collapse
- #all_sideloads(memo = {}) ⇒ Object
- #allow_sideload(name, opts = {}, &blk) ⇒ Object
- #apply_sideload_to_serializer(name) ⇒ Object
- #apply_sideloads_to_serializer ⇒ Object
- #association_names(memo = []) ⇒ Object
- #association_types(memo = []) ⇒ Object
- #belongs_to(name, opts = {}, &blk) ⇒ Object
-
#eagerly_apply_sideload?(sideload) ⇒ Boolean
If eager loading, ensure routes are loaded first, then apply This happens in Railtie.
- #has_many(name, opts = {}, &blk) ⇒ Object
- #has_one(name, opts = {}, &blk) ⇒ Object
- #many_to_many(name, opts = {}, &blk) ⇒ Object
- #polymorphic_belongs_to(name, opts = {}, &blk) ⇒ Object
- #polymorphic_has_many(name, opts = {}, &blk) ⇒ Object
- #polymorphic_has_one(name, opts = {}, &blk) ⇒ Object
- #sideload(name) ⇒ Object
Instance Method Details
#all_sideloads(memo = {}) ⇒ Object
98 99 100 101 102 103 104 105 106 |
# File 'lib/graphiti/resource/sideloading.rb', line 98 def all_sideloads(memo = {}) sideloads.each_pair do |name, sideload| unless memo[name] memo[name] = sideload memo.merge!(sideload.resource.class.all_sideloads(memo)) end end memo end |
#allow_sideload(name, opts = {}, &blk) ⇒ Object
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# File 'lib/graphiti/resource/sideloading.rb', line 9 def allow_sideload(name, opts = {}, &blk) klass = Class.new(opts.delete(:class) || Sideload) klass.class_eval(&blk) if blk opts[:parent_resource] = self relationship_option(opts, :readable) relationship_option(opts, :writable) sideload = klass.new(name, opts) if (parent = opts[:parent]) parent.children[name] = sideload else config[:sideloads][name] = sideload apply_sideload_to_serializer(name) if eagerly_apply_sideload?(sideload) end sideload end |
#apply_sideload_to_serializer(name) ⇒ Object
25 26 27 28 |
# File 'lib/graphiti/resource/sideloading.rb', line 25 def apply_sideload_to_serializer(name) config[:sideloads][name].register_public_id_source Util::SerializerRelationships.new(self, config[:sideloads].slice(name)).apply end |
#apply_sideloads_to_serializer ⇒ Object
30 31 32 33 |
# File 'lib/graphiti/resource/sideloading.rb', line 30 def apply_sideloads_to_serializer config[:sideloads].each_value(&:register_public_id_source) Util::SerializerRelationships.new(self, config[:sideloads]).apply end |
#association_names(memo = []) ⇒ Object
108 109 110 111 112 113 114 115 116 117 |
# File 'lib/graphiti/resource/sideloading.rb', line 108 def association_names(memo = []) all_sideloads.each_pair do |name, sl| unless memo.include?(sl.name) memo << sl.name memo |= sl.resource.class.association_names(memo) end end memo end |
#association_types(memo = []) ⇒ Object
119 120 121 122 123 124 125 126 127 128 |
# File 'lib/graphiti/resource/sideloading.rb', line 119 def association_types(memo = []) all_sideloads.each_pair do |name, sl| unless memo.include?(sl.resource.type) memo << sl.resource.type memo |= sl.resource.class.association_types(memo) end end memo end |
#belongs_to(name, opts = {}, &blk) ⇒ Object
40 41 42 43 |
# File 'lib/graphiti/resource/sideloading.rb', line 40 def belongs_to(name, opts = {}, &blk) opts[:class] ||= adapter.sideloading_classes[:belongs_to] allow_sideload(name, opts, &blk) end |
#eagerly_apply_sideload?(sideload) ⇒ Boolean
If eager loading, ensure routes are loaded first, then apply This happens in Railtie. Setup runs once, so classes redefined by a reload apply at definition.
132 133 134 135 136 137 138 139 |
# File 'lib/graphiti/resource/sideloading.rb', line 132 def eagerly_apply_sideload?(sideload) # TODO: Maybe handle this in the Rails integration if defined?(::Rails) && (app = ::Rails.application) app.config.eager_load ? Graphiti.setup? : true else sideload.resource_class_loaded? end end |
#has_many(name, opts = {}, &blk) ⇒ Object
35 36 37 38 |
# File 'lib/graphiti/resource/sideloading.rb', line 35 def has_many(name, opts = {}, &blk) opts[:class] ||= adapter.sideloading_classes[:has_many] allow_sideload(name, opts, &blk) end |
#has_one(name, opts = {}, &blk) ⇒ Object
45 46 47 48 |
# File 'lib/graphiti/resource/sideloading.rb', line 45 def has_one(name, opts = {}, &blk) opts[:class] ||= adapter.sideloading_classes[:has_one] allow_sideload(name, opts, &blk) end |
#many_to_many(name, opts = {}, &blk) ⇒ Object
50 51 52 53 |
# File 'lib/graphiti/resource/sideloading.rb', line 50 def many_to_many(name, opts = {}, &blk) opts[:class] ||= adapter.sideloading_classes[:many_to_many] allow_sideload(name, opts, &blk) end |
#polymorphic_belongs_to(name, opts = {}, &blk) ⇒ Object
55 56 57 58 59 60 61 62 63 64 |
# File 'lib/graphiti/resource/sideloading.rb', line 55 def polymorphic_belongs_to(name, opts = {}, &blk) opts[:resource] ||= Class.new(::Graphiti::Resource) { self.polymorphic = [] self.abstract_class = true } # adapters *probably* don't need to override this, but it's allowed opts[:class] ||= adapter.sideloading_classes[:polymorphic_belongs_to] opts[:class] ||= ::Graphiti::Sideload::PolymorphicBelongsTo allow_sideload(name, opts, &blk) end |
#polymorphic_has_many(name, opts = {}, &blk) ⇒ Object
66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/graphiti/resource/sideloading.rb', line 66 def polymorphic_has_many(name, opts = {}, &blk) as = opts.delete(:as) opts[:foreign_key] ||= :"#{as}_id" opts[:polymorphic_as] ||= as model_ref = model has_many name, opts do params do |hash| hash[:filter][:"#{as}_type"] = {eql: model_ref.name} end instance_eval(&blk) if blk end end |
#polymorphic_has_one(name, opts = {}, &blk) ⇒ Object
80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/graphiti/resource/sideloading.rb', line 80 def polymorphic_has_one(name, opts = {}, &blk) as = opts.delete(:as) opts[:foreign_key] ||= :"#{as}_id" opts[:polymorphic_as] ||= as model_ref = model has_one name, opts do params do |hash| hash[:filter][:"#{as}_type"] = {eql: model_ref.name} end instance_eval(&blk) if blk end end |
#sideload(name) ⇒ Object
94 95 96 |
# File 'lib/graphiti/resource/sideloading.rb', line 94 def sideload(name) sideloads[name] end |