Module: Mongoid::Touchable::InstanceMethods
- Included in:
- Document
- Defined in:
- build/mongoid-7.3/lib/mongoid/touchable.rb
Instance Method Summary collapse
-
#touch(field = nil) ⇒ true/false
Touch the document, in effect updating its updated_at timestamp and optionally the provided field to the current time.
Instance Method Details
#touch(field = nil) ⇒ true/false
Note:
This will not autobuild associations if those options are set.
Touch the document, in effect updating its updated_at timestamp and optionally the provided field to the current time. If any belongs_to associations exist with a touch option, they will be updated as well.
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'build/mongoid-7.3/lib/mongoid/touchable.rb', line 26 def touch(field = nil) return false if _root.new_record? current = Time.now field = database_field_name(field) write_attribute(:updated_at, current) if respond_to?("updated_at=") write_attribute(field, current) if field # If the document being touched is embedded, touch its parents # all the way through the composition hierarchy to the root object, # because when an embedded document is changed the write is actually # performed by the composition root. See MONGOID-3468. if _parent # This will persist updated_at on this document as well as parents. # TODO support passing the field name to the parent's touch method; # I believe it should be read out of # _association.inverse_association.options but inverse_association # seems to not always/ever be set here. See MONGOID-5014. _parent.touch if field # If we are told to also touch a field, perform a separate write # for that field. See MONGOID-5136. # In theory we should combine the writes, which would require # passing the fields to be updated to the parents - MONGOID-5142. sets = set_field_atomic_updates(field) selector = atomic_selector _root.collection.find(selector).update_one(positionally(selector, sets), session: _session) end else # If the current document is not embedded, it is composition root # and we need to persist the write here. touches = touch_atomic_updates(field) unless touches["$set"].blank? selector = atomic_selector _root.collection.find(selector).update_one(positionally(selector, touches), session: _session) end end # Callbacks are invoked on the composition root first and on the # leaf-most embedded document last. # TODO add tests, see MONGOID-5015. run_callbacks(:touch) true end |