Module: Mongoid::Callbacks

Extended by:
ActiveSupport::Concern
Included in:
Components
Defined in:
lib/mongoid/callbacks.rb

Overview

This module contains all the callback hooks for Mongoid.

Defined Under Namespace

Modules: ClassMethods

Constant Summary collapse

CALLBACKS =
[
  :after_build,
  :after_create,
  :after_destroy,
  :after_find,
  :after_initialize,
  :after_save,
  :after_touch,
  :after_update,
  :after_upsert,
  :after_validation,
  :around_create,
  :around_destroy,
  :around_save,
  :around_update,
  :around_upsert,
  :before_create,
  :before_destroy,
  :before_save,
  :before_update,
  :before_upsert,
  :before_validation
].freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.observablesArray<Symbol>

Get all callbacks that can be observed.

Examples:

Get the observables.

Callbacks.observables

Returns:

  • (Array<Symbol>)

    The names of the observables.

Since:

  • 3.1.0



273
274
275
# File 'lib/mongoid/callbacks.rb', line 273

def observables
  CALLBACKS + registered_observables
end

.registered_observablesArray<Symbol>

Get all registered callbacks that can be observed, not included in Mongoid’s defaults.

Examples:

Get the observables.

Callbacks.registered_observables

Returns:

  • (Array<Symbol>)

    The names of the registered observables.

Since:

  • 3.1.0



286
287
288
# File 'lib/mongoid/callbacks.rb', line 286

def registered_observables
  @registered_observables ||= []
end

Instance Method Details

#callback_executable?(kind) ⇒ true, false

Is the provided type of callback executable by this document?

Examples:

Is the callback executable?

document.callback_executable?(:save)

Parameters:

  • kin (Symbol)

    The type of callback.

Returns:

  • (true, false)

    If the callback can be executed.

Since:

  • 3.0.6



52
53
54
# File 'lib/mongoid/callbacks.rb', line 52

def callback_executable?(kind)
  respond_to?("_#{kind}_callbacks")
end

#in_callback_state?(kind) ⇒ true, false

Is the document currently in a state that could potentially require callbacks to be executed?

Examples:

Is the document in a callback state?

document.in_callback_state?(:update)

Parameters:

  • kind (Symbol)

    The callback kind.

Returns:

  • (true, false)

    If the document is in a callback state.

Since:

  • 3.1.0



67
68
69
# File 'lib/mongoid/callbacks.rb', line 67

def in_callback_state?(kind)
  [ :create, :destroy ].include?(kind) || new_record? || flagged_for_destroy? || changed?
end

#run_after_callbacks(*kinds) ⇒ Object

Note:

ActiveSupport does not allow this type of behaviour by default, so Mongoid has to get around it and implement itself.

Run only the after callbacks for the specific event.

Examples:

Run only the after save callbacks.

model.run_after_callbacks(:save)

Parameters:

  • kinds (Array<Symbol>)

    The events that are occurring.

Returns:

  • (Object)

    The result of the chain executing.

Since:

  • 3.0.0



84
85
86
87
88
# File 'lib/mongoid/callbacks.rb', line 84

def run_after_callbacks(*kinds)
  kinds.each do |kind|
    run_targeted_callbacks(:after, kind)
  end
end

#run_before_callbacks(*kinds) ⇒ Object

Note:

ActiveSupport does not allow this type of behaviour by default, so Mongoid has to get around it and implement itself.

Run only the before callbacks for the specific event.

Examples:

Run only the before save callbacks.

model.run_before_callbacks(:save, :create)

Parameters:

  • kinds (Array<Symbol>)

    The events that are occurring.

Returns:

  • (Object)

    The result of the chain executing.

Since:

  • 3.0.0



103
104
105
106
107
# File 'lib/mongoid/callbacks.rb', line 103

def run_before_callbacks(*kinds)
  kinds.each do |kind|
    run_targeted_callbacks(:before, kind)
  end
end

#run_callbacks(kind, *args, &block) ⇒ Document

Run the callbacks for the document. This overrides active support’s functionality to cascade callbacks to embedded documents that have been flagged as such.

Examples:

Run the callbacks.

run_callbacks :save do
  save!
end

Parameters:

  • kind (Symbol)

    The type of callback to execute.

  • *args (Array)

    Any options.

Returns:

Since:

  • 2.3.0



124
125
126
127
128
129
130
131
# File 'lib/mongoid/callbacks.rb', line 124

def run_callbacks(kind, *args, &block)
  cascadable_children(kind).each do |child|
    unless child.run_callbacks(child_callback_type(kind, child), *args)
      return false
    end
  end
  callback_executable?(kind) ? super(kind, *args, &block) : true
end