Module: Mongoid::Traversable

Extended by:
ActiveSupport::Concern
Included in:
Composable
Defined in:
build/mongoid-7.3/lib/mongoid/traversable.rb

Overview

Provides behavior around traversing the document graph.

Since:

  • 4.0.0

Defined Under Namespace

Modules: ClassMethods, DiscriminatorAssignment, DiscriminatorRetrieval

Instance Method Summary collapse

Instance Method Details

#_childrenArray<Document>

Get all child Documents to this Document, going n levels deep if necessary. This is used when calling update persistence operations from the root document, where changes in the entire tree need to be determined. Note that persistence from the embedded documents will always be preferred, since they are optimized calls… This operation can get expensive in domains with large hierarchies.

Examples:

Get all the document’s children.

person._children

Returns:

  • (Array<Document>)

    All child documents in the hierarchy.

Since:

  • 4.0.0



132
133
134
# File 'build/mongoid-7.3/lib/mongoid/traversable.rb', line 132

def _children
  @__children ||= collect_children
end

#_parentObject

Since:

  • 4.0.0



14
15
16
# File 'build/mongoid-7.3/lib/mongoid/traversable.rb', line 14

def _parent
  @__parent ||= nil
end

#_parent=(p) ⇒ Object

Since:

  • 4.0.0



18
19
20
# File 'build/mongoid-7.3/lib/mongoid/traversable.rb', line 18

def _parent=(p)
  @__parent = p
end

#_reset_memoized_children!nil

Resets the memoized children on the object. Called internally when an embedded array changes size.

Examples:

Reset the memoized children.

document._reset_memoized_children!

Returns:

  • (nil)

    nil.

Since:

  • 5.0.0



244
245
246
247
# File 'build/mongoid-7.3/lib/mongoid/traversable.rb', line 244

def _reset_memoized_children!
  _parent._reset_memoized_children! if _parent
  @__children = nil
end

#_rootDocument

Return the root document in the object graph. If the current document is the root object in the graph it will return self.

Examples:

Get the root document in the hierarchy.

document._root

Returns:

  • (Document)

    The root document in the hierarchy.

Since:

  • 4.0.0



256
257
258
259
260
# File 'build/mongoid-7.3/lib/mongoid/traversable.rb', line 256

def _root
  object = self
  while (object._parent) do object = object._parent; end
  object
end

#_root?true, false

Is this document the root document of the hierarchy?

Examples:

Is the document the root?

document._root?

Returns:

  • (true, false)

    If the document is the root.

Since:

  • 3.1.0



270
271
272
# File 'build/mongoid-7.3/lib/mongoid/traversable.rb', line 270

def _root?
  _parent ? false : true
end

#collect_childrenArray<Document>

Collect all the children of this document.

Examples:

Collect all the children.

document.collect_children

Returns:

Since:

  • 2.4.0



144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'build/mongoid-7.3/lib/mongoid/traversable.rb', line 144

def collect_children
  children = []
  embedded_relations.each_pair do |name, association|
    without_autobuild do
      child = send(name)
      Array.wrap(child).each do |doc|
        children.push(doc)
        children.concat(doc._children)
      end if child
    end
  end
  children
end

#flag_children_persistedArray<Document>

Marks all children as being persisted.

Examples:

Flag all the children.

document.flag_children_persisted

Returns:

  • (Array<Document>)

    The flagged children.

Since:

  • 3.0.7



166
167
168
169
170
# File 'build/mongoid-7.3/lib/mongoid/traversable.rb', line 166

def flag_children_persisted
  _children.each do |child|
    child.new_record = false
  end
end

#hereditary?true, false

Determines if the document is a subclass of another document.

Examples:

Check if the document is a subclass

Square.new.hereditary?

Returns:

  • (true, false)

    True if hereditary, false if not.

Since:

  • 4.0.0



178
179
180
# File 'build/mongoid-7.3/lib/mongoid/traversable.rb', line 178

def hereditary?
  self.class.hereditary?
end

#parentize(document) ⇒ Document

Sets up a child/parent association. This is used for newly created objects so they can be properly added to the graph.

Examples:

Set the parent document.

document.parentize(parent)

Parameters:

  • document (Document)

    The parent document.

Returns:

Since:

  • 4.0.0



191
192
193
# File 'build/mongoid-7.3/lib/mongoid/traversable.rb', line 191

def parentize(document)
  self._parent = document
end

#remove_child(child) ⇒ Object

Remove a child document from this parent. If an embeds one then set to nil, otherwise remove from the embeds many.

This is called from the RemoveEmbedded persistence command.

Examples:

Remove the child.

document.remove_child(child)

Parameters:

  • child (Document)

    The child (embedded) document to remove.

Since:

  • 2.0.0.beta.1



206
207
208
209
210
211
212
213
214
# File 'build/mongoid-7.3/lib/mongoid/traversable.rb', line 206

def remove_child(child)
  name = child.association_name
  if child.embedded_one?
    remove_ivar(name)
  else
    relation = send(name)
    relation.send(:delete_one, child)
  end
end

#reset_persisted_childrenArray<Document>

After children are persisted we can call this to move all their changes and flag them as persisted in one call.

Examples:

Reset the children.

document.reset_persisted_children

Returns:

Since:

  • 2.1.0



225
226
227
228
229
230
231
# File 'build/mongoid-7.3/lib/mongoid/traversable.rb', line 225

def reset_persisted_children
  _children.each do |child|
    child.move_changes
    child.new_record = false
  end
  _reset_memoized_children!
end