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