Порядок обратных вызовов в Rails - PullRequest
0 голосов
/ 10 июля 2020

Если в моем файле модели есть такой код:

after_destroy :method_1
after_destroy :method_2

Выполняются ли метод_1 и метод_2 вместе или сначала метод_1, а затем метод_2? Имеет ли значение, если я сделаю это:

after_destroy :method_1, method_2

Ссылка на документацию была бы отличной. спасибо

Ответы [ 2 ]

3 голосов
/ 10 июля 2020

ActiveRecord :: Callbacks документирует порядок в «Заказе обратных вызовов».

Нетранзакционные обратные вызовы выполняются в том порядке, в котором они определены.

class Topic < ActiveRecord::Base
  after_save :log_children
  after_save :do_something_else

  ...
end

При сохранении Topi c выполняется log_children, затем do_something_else.

Транзакционные обратные вызовы (after_commit, after_rollback) противоположны, последний определенный транзакционный обратный вызов выполняется первым.

class Topic < ActiveRecord::Base
  after_commit :log_children
  after_commit :do_something_else

  ...
end

Когда Topi c фиксируется, сначала запускается do_something_else, затем log_children.

Если есть сомнения, вы можете объединить их в один обратный вызов.

class Topic < ActiveRecord::Base
  after_commit :commit_callback

  private def commit_callback
    log_children
    do_something_else
  end

  ...
end
0 голосов
/ 10 июля 2020

По этому поводу нет надлежащей документации, но это довольно легко проверить:

  after_create :callback_1
  after_create :callback_2

  private

  def callback_1
    puts "CALBACK 1 !!!"
  end

  def callback_2
    puts "CALBACK 2 !!!"
  end

даст следующий результат:

CALBACK 1 !!!
CALBACK 2 !!!

и если вы измените это на

  after_create :callback_2
  after_create :callback_1

  private

  def callback_1
    puts "CALBACK 1 !!!"
  end

  def callback_2
    puts "CALBACK 2 !!!"
  end

Результат изменится на:

CALBACK 2 !!!
CALBACK 1 !!!

Аналогично работает с after_create :callback_1, :callback_2 и after_create :callback_2, :callback_1.

Итак, вывод: обратные вызовы выполняются в порядок их регистрации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...