Module: Mongoid::Touchable::InstanceMethods
| Relationships & Source Files | |
| Extension / Inclusion / Inheritance Descendants | |
| Included In: | |
| Defined in: | lib/mongoid/touchable.rb | 
Overview
Refactor using ActiveSupport::Concern
Used to provide mixin functionality.
Instance Attribute Summary
- 
    
      #_touchable_parent?  ⇒ Boolean 
    
    readonly
    Internal use only
    Internal use only
    Indicates whether the parent exists and is touchable. 
- 
    
      #touch_callbacks_suppressed?  ⇒ true | false 
    
    readonly
    Internal use only
    Internal use only
    Queries whether touch callbacks are being suppressed for the class that includes this module. 
Instance Method Summary
- 
    
      #_clear_touch_updates(field = nil)  
    
    Internal use only
    Internal use only
    Clears changes for the model caused by touch operation. 
- 
    
      #_gather_touch_updates(now, field = nil)  ⇒ Hash<String, Time> 
    
    Internal use only
    Internal use only
    Recursively sets touchable fields on the current document and each of its parents, including the root node. 
- 
    
      #_run_touch_callbacks_from_root  
    
    Internal use only
    Internal use only
    Recursively runs :touchcallbacks for the document and its parents, beginning with the root document and cascading through each successive child document.
- 
    
      #suppress_touch_callbacks  
    
    Internal use only
    Internal use only
    Suppresses the invocation of touch callbacks, for the class that includes this module, for the duration of the block. 
- 
    
      #touch(field = nil)  ⇒ true/false 
    
    Touch the document, in effect updating its updated_at timestamp and optionally the provided field to the current time. 
- 
    
      #_extract_touches_from_atomic_sets(field = nil)  ⇒ Hash 
    
    private
    Internal use only
    Internal use only
    Extract and remove the atomic updates for the touch operation(s) from the currently enqueued atomic $set operations. 
Instance Attribute Details
#_touchable_parent? ⇒ Boolean (readonly)
Indicates whether the parent exists and is touchable.
# File 'lib/mongoid/touchable.rb', line 113
def _touchable_parent? _parent && _association&.inverse_association&.touchable? end
    #touch_callbacks_suppressed?  ⇒ true | false  (readonly)
  
  Queries whether touch callbacks are being suppressed for the class that includes this module.
# File 'lib/mongoid/touchable.rb', line 32
def touch_callbacks_suppressed? Touchable.touch_callbacks_suppressed?(self.class.name) end
Instance Method Details
#_clear_touch_updates(field = nil)
Clears changes for the model caused by touch operation.
# File 'lib/mongoid/touchable.rb', line 93
def _clear_touch_updates(field = nil) remove_change(:updated_at) remove_change(field) if field _parent._clear_touch_updates if _touchable_parent? end
#_extract_touches_from_atomic_sets(field = nil) ⇒ Hash (private)
Extract and remove the atomic updates for the touch operation(s) from the currently enqueued atomic $set operations.
# File 'lib/mongoid/touchable.rb', line 127
def _extract_touches_from_atomic_sets(field = nil) updates = atomic_updates['$set'] return {} unless updates touchable_keys = Set['updated_at', 'u_at'] touchable_keys << field.to_s if field.present? updates.keys.each_with_object({}) do |key, touches| if touchable_keys.include?(key.split('.').last) touches[key] = updates.delete(key) end end end
#_gather_touch_updates(now, field = nil) ⇒ Hash<String, Time>
Recursively sets touchable fields on the current document and each of its parents, including the root node. Returns the combined atomic $set operations to be performed on the root document.
# File 'lib/mongoid/touchable.rb', line 75
def _gather_touch_updates(now, field = nil) return if touch_callbacks_suppressed? field = database_field_name(field) write_attribute(:updated_at, now) if respond_to?("updated_at=") write_attribute(field, now) if field.present? touches = _extract_touches_from_atomic_sets(field) || {} touches.merge!(_parent._gather_touch_updates(now) || {}) if _touchable_parent? touches end
#_run_touch_callbacks_from_root
Recursively runs :touch callbacks for the document and its parents, beginning with the root document and cascading through each successive child document.
# File 'lib/mongoid/touchable.rb', line 104
def _run_touch_callbacks_from_root return if touch_callbacks_suppressed? _parent._run_touch_callbacks_from_root if _touchable_parent? run_callbacks(:touch) end
#suppress_touch_callbacks
Suppresses the invocation of touch callbacks, for the class that includes this module, for the duration of the block.
# File 'lib/mongoid/touchable.rb', line 22
def suppress_touch_callbacks Touchable.suppress_touch_callbacks(self.class.name) { yield } end
    #touch(field = nil)  ⇒ true/false 
  
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.
# File 'lib/mongoid/touchable.rb', line 51
def touch(field = nil) return false if _root.new_record? begin touches = _gather_touch_updates(Time.current, field) _root.send(:persist_atomic_operations, '$set' => touches) if touches.present? _run_touch_callbacks_from_root ensure _clear_touch_updates(field) end true end