module Mongoid::Touchable

Public Instance Methods

define_touchable!(association) click to toggle source

Add the association to the touchable relations if the touch option was provided.

@example Add the touchable.

Model.define_touchable!(assoc)

@param [ Association ] association The association metadata.

@return [ Class ] The model class.

@since 3.0.0

# File lib/mongoid/touchable.rb, line 55
def define_touchable!(association)
  name = association.name
  method_name = define_relation_touch_method(name, association)
  association.inverse_class.tap do |klass|
    klass.after_save method_name
    klass.after_destroy method_name
    klass.after_touch method_name
  end
end

Private Instance Methods

define_relation_touch_method(name, association) click to toggle source

Define the method that will get called for touching belongs_to relations.

@api private

@example Define the touch relation.

Model.define_relation_touch_method(:band)
Model.define_relation_touch_method(:band, :band_updated_at)

@param [ Symbol ] name The name of the relation. @param [ Association ] association The association metadata.

@since 3.1.0

@return [ Symbol ] The method name.

# File lib/mongoid/touchable.rb, line 82
    def define_relation_touch_method(name, association)
      relation_classes = if association.polymorphic?
                           association.send(:inverse_association_classes)
                         else
                           [ association.relation_class ]
                         end

      relation_classes.each { |c| c.send(:include, InstanceMethods) }
      method_name = "touch_#{name}_after_create_or_destroy"
      association.inverse_class.class_eval <<-TOUCH, __FILE__, __LINE__ + 1
          def #{method_name}
            without_autobuild do
              relation = __send__(:#{name})
              relation.touch #{":#{association.touch_field}" if association.touch_field} if relation
            end
          end
      TOUCH
      method_name.to_sym
    end