class Brainstem::Preloader

Takes a list of arbitrarily nested objects, compacts them, de-duplicates them, and passes them to ActiveRecord to preload.

The following is considered a valid data structure:

[:workspaces, {"workspaces" => [:projects], "users" }

Which will produce the following for ActiveRecord:

{"workspaces" => [:projects], "users" => []}

Attributes

models[RW]

Instance API

preload_method[W]
preloads[RW]

Instance API

reflections[RW]

Instance API

valid_preloads[RW]

Instance API

Public Class Methods

new(models, preloads, reflections, preload_method = nil) click to toggle source
# File lib/brainstem/preloader.rb, line 36
def initialize(models, preloads, reflections, preload_method = nil)
  self.models         = models
  self.preloads       = preloads.compact
  self.reflections    = reflections
  self.preload_method = preload_method
  self.valid_preloads = {}
end
preload(*args) click to toggle source
# File lib/brainstem/preloader.rb, line 19
def preload(*args)
  new(*args).call
end

Public Instance Methods

call() click to toggle source
# File lib/brainstem/preloader.rb, line 44
def call
  clean!
  preload!
end

Private Instance Methods

clean!() click to toggle source

De-duplicates, reformats, and prunes requested preloads into an acceptable format for the preloader

# File lib/brainstem/preloader.rb, line 55
def clean!
  dedupe!
  remove_unreflected_preloads!
end
dedupe!() click to toggle source
# File lib/brainstem/preloader.rb, line 80
def dedupe!
  preloads.each do |preload_name|
    case preload_name
    when Hash
      preload_name.each do |key, value|
        (valid_preloads[key.to_s] ||= Array.new) << value
      end
    when NilClass
    else
      valid_preloads[preload_name.to_s] ||= []
    end
  end
end
preload!() click to toggle source
# File lib/brainstem/preloader.rb, line 60
def preload!
  preload_method.call(models, valid_preloads) if valid_preloads.keys.any?
end
preload_method() click to toggle source

Returns a proc that takes two arguments, models and association_names, which, when called, preloads those.

@return [Proc] A callable proc

# File lib/brainstem/preloader.rb, line 68
def preload_method
  @preload_method ||= begin
    if Gem.loaded_specs['activerecord'].version >= Gem::Version.create('4.1')
      ActiveRecord::Associations::Preloader.new.method(:preload)
    else
      Proc.new do |models, association_names|
        ActiveRecord::Associations::Preloader.new(models, association_names).run
      end
    end
  end
end
remove_unreflected_preloads!() click to toggle source
# File lib/brainstem/preloader.rb, line 94
def remove_unreflected_preloads!
  valid_preloads.select! { |preload_name, _| reflections.has_key?(preload_name.to_s) }
end