Module: Mongoid::Traversable
- Extended by:
- ActiveSupport::Concern
- Included in:
- Composable
- Defined in:
- build/mongoid-6.1/lib/mongoid/traversable.rb
Overview
Provides behaviour around traversing the document graph.
Defined Under Namespace
Modules: ClassMethods
Instance Method Summary collapse
-
#_children ⇒ Array<Document>
Get all child
Documents
to thisDocument
, going n levels deep if necessary. - #_parent ⇒ Object
- #_parent=(p) ⇒ Object
-
#_reset_memoized_children! ⇒ nil
Resets the memoized children on the object.
-
#_root ⇒ Document
Return the root document in the object graph.
-
#_root? ⇒ true, false
Is this document the root document of the hierarchy?.
-
#collect_children ⇒ Array<Document>
Collect all the children of this document.
-
#flag_children_persisted ⇒ Array<Document>
Marks all children as being persisted.
-
#hereditary? ⇒ true, false
Determines if the document is a subclass of another document.
-
#parentize(document) ⇒ Document
Sets up a child/parent association.
-
#remove_child(child) ⇒ Object
Remove a child document from this parent.
-
#reset_persisted_children ⇒ Array<Document>
After children are persisted we can call this to move all their changes and flag them as persisted in one call.
Instance Method Details
#_children ⇒ Array<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.
29 30 31 |
# File 'build/mongoid-6.1/lib/mongoid/traversable.rb', line 29 def _children @__children ||= collect_children end |
#_parent ⇒ Object
10 11 12 |
# File 'build/mongoid-6.1/lib/mongoid/traversable.rb', line 10 def _parent @__parent end |
#_parent=(p) ⇒ Object
14 15 16 |
# File 'build/mongoid-6.1/lib/mongoid/traversable.rb', line 14 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.
141 142 143 144 |
# File 'build/mongoid-6.1/lib/mongoid/traversable.rb', line 141 def _reset_memoized_children! _parent._reset_memoized_children! if _parent @__children = nil end |
#_root ⇒ Document
Return the root document in the object graph. If the current document is the root object in the graph it will return self.
153 154 155 156 157 |
# File 'build/mongoid-6.1/lib/mongoid/traversable.rb', line 153 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?
167 168 169 |
# File 'build/mongoid-6.1/lib/mongoid/traversable.rb', line 167 def _root? _parent ? false : true end |
#collect_children ⇒ Array<Document>
Collect all the children of this document.
41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'build/mongoid-6.1/lib/mongoid/traversable.rb', line 41 def collect_children children = [] .each_pair do |name, | 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_persisted ⇒ Array<Document>
Marks all children as being persisted.
63 64 65 66 67 |
# File 'build/mongoid-6.1/lib/mongoid/traversable.rb', line 63 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.
75 76 77 |
# File 'build/mongoid-6.1/lib/mongoid/traversable.rb', line 75 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.
88 89 90 |
# File 'build/mongoid-6.1/lib/mongoid/traversable.rb', line 88 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.
103 104 105 106 107 108 109 110 111 |
# File 'build/mongoid-6.1/lib/mongoid/traversable.rb', line 103 def remove_child(child) name = child. if child. remove_ivar(name) else relation = send(name) relation.send(:delete_one, child) end end |
#reset_persisted_children ⇒ Array<Document>
After children are persisted we can call this to move all their changes and flag them as persisted in one call.
122 123 124 125 126 127 128 |
# File 'build/mongoid-6.1/lib/mongoid/traversable.rb', line 122 def reset_persisted_children _children.each do |child| child.move_changes child.new_record = false end _reset_memoized_children! end |