Class: OccamsRecord::EagerLoaders::Base
- Inherits:
-
Object
- Object
- OccamsRecord::EagerLoaders::Base
- Includes:
- Builder
- Defined in:
- lib/occams-record/eager_loaders/base.rb
Overview
Base class for eagoer loading an association. IMPORTANT eager loaders MUST remain stateless after initialization!
Instance Attribute Summary collapse
- #eager_loaders ⇒ OccamsRecord::EagerLoaders::Context readonly
-
#name ⇒ String
readonly
Association name.
-
#tracer ⇒ OccamsRecord::EagerLoaders::Tracer | nil
readonly
A reference to this eager loader and its parent (if any).
Instance Method Summary collapse
-
#initialize(ref, scope = nil, use: nil, as: nil, optimizer: :select, parent: nil, active_record_fallback: nil) { ... } ⇒ Base
constructor
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.
-
#run(rows, query_logger: nil, measurements: nil) ⇒ Object
Run the query and merge the results into the given rows.
-
#scope {|ActiveRecord::Relation| ... } ⇒ Object
An alternative to passing a “scope” lambda to the constructor.
Methods included from Builder
#eager_load, #eager_load_many, #eager_load_one, #nest
Constructor Details
#initialize(ref, scope = nil, use: nil, as: nil, optimizer: :select, parent: nil, active_record_fallback: nil) { ... } ⇒ Base
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.
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/occams-record/eager_loaders/base.rb', line 29 def initialize(ref, scope = nil, use: nil, as: nil, optimizer: :select, parent: nil, active_record_fallback: nil, &builder) @ref, @scopes, @use, @as = ref, Array(scope), use, as @model = ref.klass @name = (as || ref.name).to_s @tracer = Tracer.new(name, parent) @eager_loaders = EagerLoaders::Context.new(@model, tracer: @tracer) @active_record_fallback = active_record_fallback @optimizer = optimizer if builder if builder.arity > 0 builder.call(self) else instance_exec(&builder) end end end |
Instance Attribute Details
#eager_loaders ⇒ OccamsRecord::EagerLoaders::Context (readonly)
16 17 18 |
# File 'lib/occams-record/eager_loaders/base.rb', line 16 def eager_loaders @eager_loaders end |
#name ⇒ String (readonly)
Returns association name.
10 11 12 |
# File 'lib/occams-record/eager_loaders/base.rb', line 10 def name @name end |
#tracer ⇒ OccamsRecord::EagerLoaders::Tracer | nil (readonly)
Returns a reference to this eager loader and its parent (if any).
13 14 15 |
# File 'lib/occams-record/eager_loaders/base.rb', line 13 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.
66 67 68 69 70 71 72 |
# File 'lib/occams-record/eager_loaders/base.rb', line 66 def run(rows, query_logger: nil, measurements: nil) query(rows) { |*args| assoc_rows = args[0] ? Query.new(args[0], use: @use, eager_loaders: @eager_loaders, query_logger: query_logger, measurements: measurements, active_record_fallback: @active_record_fallback).run : [] merge! assoc_rows, rows, *args[1..-1] } 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.
55 56 57 58 |
# File 'lib/occams-record/eager_loaders/base.rb', line 55 def scope(&scope) @scopes << scope if scope self end |