class Mongoid::Association::Referenced::Eager::Base

Base class for eager load preload functions.

@since 4.0.0

Public Class Methods

new(associations, docs) click to toggle source

Instantiate the eager load class.

@example Create the new belongs to eager load preloader.

BelongsTo.new(association, parent_docs)

@param [ Array<Association> ] associations Associations to eager load @param [ Array<Document> ] docs Documents to preload the associations

@return [ Base ] The eager load preloader

@since 4.0.0

# File lib/mongoid/association/referenced/eager.rb, line 25
def initialize(associations, docs)
  @associations = associations
  @docs = docs
  @grouped_docs = {}
end

Public Instance Methods

run() click to toggle source

Run the preloader.

@example Preload the associations into the documents.

loader.run

@return [ Array ] The list of documents given.

@since 4.0.0

# File lib/mongoid/association/referenced/eager.rb, line 39
def run
  @loaded = []
  while shift_association
    preload
    @loaded << @docs.collect { |d| d.send(@association.name) if d.respond_to?(@association.name) }
  end
  @loaded.flatten
end

Protected Instance Methods

each_loaded_document(&block) click to toggle source

Retrieves the documents referenced by the association, and yields each one sequentially to the provided block. If the association is not polymorphic, all documents are retrieved in a single query. If the association is polymorphic, one query is issued per association target class.

@since 4.0.0

# File lib/mongoid/association/referenced/eager.rb, line 69
def each_loaded_document(&block)
  each_loaded_document_of_class(@association.klass, keys_from_docs, &block)
end
group_by_key() click to toggle source

Return the key to group the current documents.

This method should be implemented in the subclass

@example Return the key for group

loader.group_by_key

@return [ Symbol ] Key to group by the current documents.

@since 4.0.0

# File lib/mongoid/association/referenced/eager.rb, line 150
def group_by_key
  raise NotImplementedError
end
grouped_docs() click to toggle source

Return a hash with the current documents grouped by key.

Documents that do not have a value for the association being loaded are not returned.

@example Return a hash with the current documents grouped by key.

loader.grouped_docs

@return [ Hash ] hash with grouped documents.

@since 4.0.0

# File lib/mongoid/association/referenced/eager.rb, line 117
def grouped_docs
  @grouped_docs[@association.name] ||= @docs.group_by do |doc|
    doc.send(group_by_key) if doc.respond_to?(group_by_key)
  end.reject do |k, v|
    k.nil?
  end
end
keys_from_docs() click to toggle source

Group the documents and return the keys.

This method omits nil keys (i.e. keys from documents that do not have a value for the association being loaded).

@example

loader.keys_from_docs

@return [ Array ] keys, ids

@since 4.0.0

# File lib/mongoid/association/referenced/eager.rb, line 136
def keys_from_docs
  grouped_docs.keys
end
preload() click to toggle source

Preload the current association.

This method should be implemented in the subclass

@example Preload the current association into the documents.

loader.preload

@since 4.0.0

# File lib/mongoid/association/referenced/eager.rb, line 58
def preload
  raise NotImplementedError
end
set_on_parent(id, element) click to toggle source

Set the pre-loaded document into its parent.

@example Set docs into parent with pk = “foo”

loader.set_on_parent("foo", docs)

@param [ ObjectId ] id parent`s id @param [ Document, Array ] element to push into the parent

@since 4.0.0

# File lib/mongoid/association/referenced/eager.rb, line 100
def set_on_parent(id, element)
  grouped_docs[id].each do |d|
    set_relation(d, element)
  end
end
set_relation(doc, element) click to toggle source

Set the pre-loaded document into its parent.

@example Set docs into parent using the current association name.

loader.set_relation(doc, docs)

@param [ Document ] doc The object to set the association on @param [ Document, Array ] element to set into the parent

@since 4.0.0

# File lib/mongoid/association/referenced/eager.rb, line 163
def set_relation(doc, element)
  doc.set_relation(@association.name, element) unless doc.blank?
end

Private Instance Methods

each_loaded_document_of_class(cls, keys) { |doc| ... } click to toggle source

Retrieves the documents of the specified class, that have the foreign key included in the specified list of keys.

When the documents are retrieved, the set of inclusions applied is the set of inclusions applied to the host document minus the association that is being eagerly loaded.

# File lib/mongoid/association/referenced/eager.rb, line 79
        def each_loaded_document_of_class(cls, keys)
  # Note: keys should not include nil elements.
  # Upstream code is responsible for eliminating nils from keys.
  return cls.none if keys.empty?

  criteria = cls.any_in(key => keys)
  criteria.inclusions = criteria.inclusions - [@association]
  criteria.each do |doc|
    yield doc
  end
end
shift_association() click to toggle source

Shift the current association metadata

@example Shift the current association.

loader.shift_association

@return [ Association ] The association object.

@since 4.0.0

# File lib/mongoid/association/referenced/eager.rb, line 177
def shift_association
  @association = @associations.shift
end