Module: Priloo::Preloadable::ClassMethods

Extended by:
Decors::DecoratorDefinition
Defined in:
lib/priloo/preloadable.rb

Instance Method Summary collapse

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