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
-
STRATEGIES =
The valid dependent strategies.
[ :delete_all, :destroy, :nullify, :restrict_with_exception, :restrict_with_error ]
Class Method Summary
-
.define_dependency!(association) ⇒ Class
Attempt to add the cascading information for the document to know how to handle associated documents on a removal.
-
.validate!(association)
Validates that an association’s dependent strategy is within the allowed enumeration.
Instance Method Summary
-
#apply_destroy_dependencies!
Perform all cascading deletes, destroys, or nullifies.
- #_dependent_delete_all!(association) private
- #_dependent_destroy!(association) private
- #_dependent_nullify!(association) private
- #_dependent_restrict_with_error!(association) private
- #_dependent_restrict_with_exception!(association) private
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.
# 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.
# 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.
# 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