module Priloo::Preloadable::ClassMethods
Public Instance Methods
declare_preloader(name, preloader)
click to toggle source
# 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)
click to toggle source
# 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)
click to toggle source
# 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)
click to toggle source
# 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)
click to toggle source
# 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