123456789_123456789_123456789_123456789_123456789_

Module: Mongoid::Association::Depending

Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Included In:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, ActiveSupport::Concern
Defined in: lib/mongoid/association/depending.rb

Overview

This module defines the behavior for setting up cascading deletes and nullifies for associations, and how to delegate to the appropriate strategy.

Constant Summary

Class Method Summary

Instance Method Summary

DSL Calls

included

[ GitHub ]


12
13
14
15
16
17
18
19
20
# File 'lib/mongoid/association/depending.rb', line 12

included do
  class_attribute :dependents

  # @api private
  class_attribute :dependents_owner

  self.dependents = []
  self.dependents_owner = self
end

Class Method Details

.define_dependency!(association) ⇒ Class

Attempt to add the cascading information for the document to know how to handle associated documents on a removal.

Examples:

::Set up cascading information

Mongoid::Association::Depending.define_dependency!(association)

Parameters:

Returns:

  • (Class)

    The class of the document.

[ GitHub ]

  
# File 'lib/mongoid/association/depending.rb', line 57

def self.define_dependency!(association)
  validate!(association)
  association.inverse_class.tap do |klass|
    if klass.dependents_owner != klass
      klass.dependents = []
      klass.dependents_owner = klass
    end

    if association.dependent && !klass.dependents.include?(association)
      klass.dependents.push(association)
    end
  end
end

.validate!(association)

Validates that an association’s dependent strategy is within the allowed enumeration.

Parameters:

[ GitHub ]

  
# File 'lib/mongoid/association/depending.rb', line 79

def self.validate!(association)
  unless STRATEGIES.include?(association.dependent)
    raise Errors::InvalidDependentStrategy.new(association,
                                               association.dependent,
                                               STRATEGIES)
  end
end

Instance Method Details

#_dependent_delete_all!(association) (private)

[ GitHub ]

  
# File 'lib/mongoid/association/depending.rb', line 102

def _dependent_delete_all!(association)
  if relation = send(association.name)
    if relation.respond_to?(:dependents) && relation.dependents.blank?
      relation.clear
    else
      ::Array.wrap(send(association.name)).each { |rel| rel.delete }
    end
  end
end

#_dependent_destroy!(association) (private)

[ GitHub ]

  
# File 'lib/mongoid/association/depending.rb', line 112

def _dependent_destroy!(association)
  if relation = send(association.name)
    if relation.is_a?(Enumerable)
      relation.entries
      relation.each { |doc| doc.destroy }
    else
      relation.destroy
    end
  end
end

#_dependent_nullify!(association) (private)

[ GitHub ]

  
# File 'lib/mongoid/association/depending.rb', line 123

def _dependent_nullify!(association)
  if relation = send(association.name)
    relation.nullify
  end
end

#_dependent_restrict_with_error!(association) (private)

[ GitHub ]

  
# File 'lib/mongoid/association/depending.rb', line 135

def _dependent_restrict_with_error!(association)
  if (relation = send(association.name)) && !relation.blank?
    errors.add(association.name, :destroy_restrict_with_error_dependencies_exist)
    throw(:abort, false)
  end
end

#_dependent_restrict_with_exception!(association) (private)

[ GitHub ]

  
# File 'lib/mongoid/association/depending.rb', line 129

def _dependent_restrict_with_exception!(association)
  if (relation = send(association.name)) && !relation.blank?
    raise Errors::DeleteRestriction.new(relation, association.name)
  end
end

#apply_destroy_dependencies!

Perform all cascading deletes, destroys, or nullifies. Will delegate to the appropriate strategy to perform the operation.

Examples:

Execute cascades.

document.apply_destroy_dependencies!
[ GitHub ]

  
# File 'lib/mongoid/association/depending.rb', line 92

def apply_destroy_dependencies!
  self.class._all_dependents.each do |association|
    if dependent = association.try(:dependent)
      send("_dependent_#{dependent}!", association)
    end
  end
end