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