Разрешает ли Rails пользовательский код фиксации и отката транзакции ruby? - PullRequest
0 голосов
/ 09 июля 2020

Как часть одной транзакции ActiveRecord (я использую PostgreSQL db), я хочу иметь обычный код, не связанный с базой данных, который выполняется только после успешной фиксации или отката транзакции. Я предполагаю передать какие-то процедуры в ActiveRecord::Base.transaction, которые будут выполнять соответствующий процесс в зависимости от фиксации или отката транзакции. Я новичок в Rails, и мне интересно, предлагается ли такая функциональность? но также возможность «отката» сетевых вызовов (с помощью отдельного запроса отката) в случае сбоя транзакции.

1 Ответ

1 голос
/ 09 июля 2020

Да. Отдельные записи могут определять обратные вызовы after_commit и after_rollback , которые срабатывают после фиксации или отката транзакции. Их также можно настроить для определенных действий, таких как создание или уничтожение записи.

class Thing < ApplicationRecord
  after_commit :cleanup_that_thing, on: :destroy
  after_rollback :the_thing_wont_die, on: :destroy

  private def cleanup_that_thing
    ...
  end

  private def the_thing_wont_die
    ...
  end
end

На уровне отдельной транзакции вы должны использовать обычный begin / rescue / else .

begin
  YourModel.transaction do
    ...
  end
rescue
  # it didn't work
else
  # it did work
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...