Class: OccamsRecord::EagerLoaders::PolymorphicBelongsTo

Inherits:
Object
  • Object
show all
Includes:
Builder
Defined in:
lib/occams-record/eager_loaders/polymorphic_belongs_to.rb

Overview

Eager loader for polymorphic belongs tos

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Builder

#eager_load, #eager_load_many, #eager_load_one, #nest

Constructor Details

#initialize(ref, scope = nil, use: nil, as: nil, optimizer: nil, parent: nil, active_record_fallback: nil) { ... } ⇒ PolymorphicBelongsTo

ActiveRecord::Relation on which you may call all the normal query hethods (select, where, etc) as well as any scopes you’ve defined on the model.

Parameters:

  • ref (ActiveRecord::Association)

    the ActiveRecord association

  • scope (Proc) (defaults to: nil)

    a scope to apply to the query (optional). It will be passed an

  • use (Array<Module>) (defaults to: nil)

    optional Module to include in the result class (single or array)

  • as (Symbol) (defaults to: nil)

    Load the association usign a different attribute name

  • optimizer (Symbol) (defaults to: nil)

    Only used for ‘through` associations. A no op here.

  • parent (OccamsRecord::EagerLoaders::Tracer) (defaults to: nil)

    the eager loader this one is nested under (if any)

  • active_record_fallback (Symbol) (defaults to: nil)

    If passed, missing methods will be forwarded to an ActiveRecord instance. Options are :lazy (allow lazy loading in the AR record) or :strict (require strict loading)

Yields:

  • perform eager loading on this association (optional)



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/occams-record/eager_loaders/polymorphic_belongs_to.rb', line 27

def initialize(ref, scope = nil, use: nil, as: nil, optimizer: nil, parent: nil, active_record_fallback: nil, &builder)
  @ref, @scopes, @use = ref, Array(scope), use
  @name = (as || ref.name).to_s
  @foreign_type = @ref.foreign_type.to_sym
  @foreign_key = @ref.foreign_key.to_sym
  @tracer = Tracer.new(name, parent)
  @eager_loaders = EagerLoaders::Context.new(nil, tracer: @tracer, polymorphic: true)
  @active_record_fallback = active_record_fallback
  if builder
    if builder.arity > 0
      builder.call(self)
    else
      instance_exec(&builder)
    end
  end
end

Instance Attribute Details

#eager_loadersOccamsRecord::EagerLoaders::Context (readonly)



14
15
16
# File 'lib/occams-record/eager_loaders/polymorphic_belongs_to.rb', line 14

def eager_loaders
  @eager_loaders
end

#nameString (readonly)

Returns association name.

Returns:

  • (String)

    association name



8
9
10
# File 'lib/occams-record/eager_loaders/polymorphic_belongs_to.rb', line 8

def name
  @name
end

#tracerOccamsRecord::EagerLoaders::Tracer | nil (readonly)

Returns a reference to this eager loader and its parent (if any).

Returns:



11
12
13
# File 'lib/occams-record/eager_loaders/polymorphic_belongs_to.rb', line 11

def tracer
  @tracer
end

Instance Method Details

#run(rows, query_logger: nil, measurements: nil) ⇒ Object

Run the query and merge the results into the given rows.

Parameters:

  • rows (Array<OccamsRecord::Results::Row>)

    Array of rows used to calculate the query.

  • query_logger (Array<String>) (defaults to: nil)


64
65
66
67
68
69
70
71
72
# File 'lib/occams-record/eager_loaders/polymorphic_belongs_to.rb', line 64

def run(rows, query_logger: nil, measurements: nil)
  query(rows) { |scope|
    eager_loaders = @eager_loaders.dup
    eager_loaders.model = scope.klass
    assoc_rows = Query.new(scope, use: @use, eager_loaders: eager_loaders, query_logger: query_logger, measurements: measurements, active_record_fallback: @active_record_fallback).run
    merge! assoc_rows, rows
  }
  nil
end

#scope {|ActiveRecord::Relation| ... } ⇒ Object

An alternative to passing a “scope” lambda to the constructor. Your block is passed the query so you can call select, where, order, etc on it.

If you call scope multiple times, the results will be additive.

Yields:

  • (ActiveRecord::Relation)

    a relation to modify with select, where, order, etc

Returns:

  • self



53
54
55
56
# File 'lib/occams-record/eager_loaders/polymorphic_belongs_to.rb', line 53

def scope(&scope)
  @scopes << scope if scope
  self
end