class Priloo::Preloaders::BmInjectorPreloader

This class implements preloading for Bannerman's custom ActiveRecord injectors

Attributes

ar_class[R]
name[R]

Public Class Methods

new(ar_class, name) click to toggle source
Calls superclass method Priloo::Preloaders::BasePreloader::new
# File lib/priloo/preloaders/bm_injector_preloader.rb, line 9
def initialize(ar_class, name)
    super([self.class, ar_class, name])

    @name = name
    @ar_class = ar_class
end

Public Instance Methods

extract(target) click to toggle source
# File lib/priloo/preloaders/bm_injector_preloader.rb, line 36
def extract(target)
    target.instance_variable_get(:@attributes).[](name).value
end
inject(target, value) click to toggle source
# File lib/priloo/preloaders/bm_injector_preloader.rb, line 28
def inject(target, value)
    target._preloadable_target.send(:write_attribute_without_type_cast, name, value)
end
injected?(target) click to toggle source
# File lib/priloo/preloaders/bm_injector_preloader.rb, line 32
def injected?(target)
    target.has_attribute?(name)
end
preload(ar_list) click to toggle source
# File lib/priloo/preloaders/bm_injector_preloader.rb, line 16
            def preload(ar_list)
                ids = ar_list.map { |ar| ar.send(primary_key) }
                injector_sql = ar_class.send("#{name}_sql")
                sql_query = Arel.sql <<~SQL
                    #{quote_table_column(ar_class.table_name, primary_key)} AS id,
                    (#{injector_sql}) AS val
                SQL

                fetched_data = ar_class.where(primary_key => ids.uniq).pluck(sql_query).to_h
                ar_list.map { |ar| fetched_data[ar.send(primary_key)] }
            end

Private Instance Methods

primary_key() click to toggle source
# File lib/priloo/preloaders/bm_injector_preloader.rb, line 50
def primary_key
    @primary_key ||= ar_class.primary_key.to_sym
end
quote_identifier(str) click to toggle source
# File lib/priloo/preloaders/bm_injector_preloader.rb, line 42
def quote_identifier(str)
    ar_class.connection.quote_column_name str.to_s
end
quote_table_column(table, column) click to toggle source
# File lib/priloo/preloaders/bm_injector_preloader.rb, line 46
def quote_table_column(table, column)
    quote_identifier(table) + '.' + quote_identifier(column)
end