Class: DeepPreloader

Inherits:
Object
  • Object
show all
Defined in:
lib/deep_preloader.rb,
lib/deep_preloader/version.rb

Defined Under Namespace

Classes: AbstractSpec, PolymorphicSpec, PreloadWorker, Spec, WorklistContext, WorklistEntry

Constant Summary collapse

VERSION =
'1.0.0'

Class Method Summary collapse

Class Method Details

.preload(models, spec, lock: nil) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/deep_preloader.rb', line 9

def self.preload(models, spec, lock: nil)
  return if spec.nil? || models.blank?

  worker = PreloadWorker.new(lock: lock)
  spec = Spec.parse(spec) unless spec.is_a?(AbstractSpec)

  models_by_class = Array.wrap(models).group_by(&:class)

  case spec
  when Spec
    unless models_by_class.size == 1
      raise ArgumentError.new("Provided multiple model types to non-polymorphic preload spec")
    end

    model_class, models = models_by_class.first
    worker.add_associations_from_spec(models, model_class, spec)
  when PolymorphicSpec
    models_by_class.each do |model_class, models|
      model_spec = spec.for_type(model_class)
      next unless model_spec
      worker.add_associations_from_spec(models, model_class, model_spec)
    end
  end

  worker.run!
  models
end