Module: Mongoid::Association::Depending

Extended by:
ActiveSupport::Concern
Included in:
Mongoid::Association
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 collapse

STRATEGIES =

The valid dependent strategies.

%i[
  delete_all
  destroy
  nullify
  restrict_with_exception
  restrict_with_error
]

Class Method Summary collapse

Instance Method Summary collapse

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.



55
56
57
58
59
60
61
62
63
64
65
# File 'lib/mongoid/association/depending.rb', line 55

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

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

.validate!(association) ⇒ Object

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

Parameters:

Raises:



75
76
77
78
79
80
81
# File 'lib/mongoid/association/depending.rb', line 75

def self.validate!(association)
  return if STRATEGIES.include?(association.dependent)

  raise Errors::InvalidDependentStrategy.new(association,
                                             association.dependent,
                                             STRATEGIES)
end

Instance Method Details

#apply_destroy_dependencies!Object

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

Examples:

Execute cascades.

document.apply_destroy_dependencies!


88
89
90
91
92
93
94
# File 'lib/mongoid/association/depending.rb', line 88

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