Module: Priloo::Preloadable::ClassMethods
- Extended by:
- Decors::DecoratorDefinition
- Defined in:
- lib/priloo/preloadable.rb
Instance Method Summary collapse
- #declare_preloader(name, preloader) ⇒ Object
- #preload_ar(name, primary_key, ar_class_name, foreign_key) ⇒ Object
- #preload_define(name, *dependencies, &block) ⇒ Object
- #preload_delegate(*names, to:, allow_nil: false, prefix: false) ⇒ Object
- #preload_many_ar(name, primary_keys, ar_class_name, foreign_key) ⇒ Object
Instance Method Details
#declare_preloader(name, preloader) ⇒ Object
118 119 120 |
# File 'lib/priloo/preloadable.rb', line 118 def declare_preloader(name, preloader) define_method(:"#{name}__priloo__") { preloader } end |
#preload_ar(name, primary_key, ar_class_name, foreign_key) ⇒ Object
97 98 99 100 101 102 103 |
# File 'lib/priloo/preloadable.rb', line 97 def preload_ar(name, primary_key, ar_class_name, foreign_key) preload_define name do |items| ids = items.map { |item| item.send(primary_key) }.compact.uniq data = ar_class_name.constantize.where(foreign_key => ids).map { |c| [c.send(foreign_key), c] }.to_h items.map { |item| data[item.send(primary_key)] } end end |
#preload_define(name, *dependencies, &block) ⇒ Object
71 72 73 74 75 76 77 78 79 80 |
# File 'lib/priloo/preloadable.rb', line 71 def preload_define(name, *dependencies, &block) preloader = Preloaders::GenericPreloader.new(name, dependencies: dependencies, &block) declare_preloader(name, preloader) define_method(name) do return preloader.extract(self) if preloader.injected?(self) preloader.preload([self]).first end end |
#preload_delegate(*names, to:, allow_nil: false, prefix: false) ⇒ Object
82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/priloo/preloadable.rb', line 82 def preload_delegate(*names, to:, allow_nil: false, prefix: false) names.each do |name| prefixed_name = prefix ? :"#{to}_#{name}" : name preload_define prefixed_name, to => name do |items| items.map do |item| through = item.send(to) raise "Cannot delegate #{name} to #{to} because Nil is not allowed" if !allow_nil && through.nil? through&.send(name) end end end end |
#preload_many_ar(name, primary_keys, ar_class_name, foreign_key) ⇒ Object
105 106 107 108 109 110 111 |
# File 'lib/priloo/preloadable.rb', line 105 def preload_many_ar(name, primary_keys, ar_class_name, foreign_key) preload_define name do |items| ids = items.map { |item| item.send(primary_keys) }.flatten.compact.uniq data = ar_class_name.constantize.where(foreign_key => ids).map { |c| [c.send(foreign_key), c] }.to_h items.map { |item| item.send(primary_keys)&.map { |pk| data[pk] } } end end |