У меня есть наблюдатель, и я регистрирую обратный вызов after_commit
.
Как я могу узнать, был ли он запущен после создания или обновления?
Я могу определить элемент был уничтожен с помощью запроса item.destroyed?
, но #new_record?
не работает, так как элемент был сохранен.
Я собирался решить эту проблему, добавив after_create
/ after_update
и сделав что-то вроде @action =: create
внутри и проверив @action
в after_commit
, но кажется, что экземпляр наблюдателя - синглтон, и я мог бы просто переопределить значение, прежде чем оно попадет в after_commit
. Поэтому я решил это более уродливым способом, сохранив действие на карте на основе item.id в after_create / update и проверив его значение в after_commit. Действительно некрасиво.
Есть ли другой способ?
Как сказал @tardate, transaction_include_action?
- хороший показатель, хотя это частный метод, и в наблюдателе к нему следует обращаться с помощью # отправить
.
class ProductScoreObserver < ActiveRecord::Observer
observe :product
def after_commit(product)
if product.send(:transaction_include_action?, :destroy)
...
К сожалению, опция : on
не работает в наблюдателях.
Просто убедитесь, что вы проверили своих наблюдателей (ищите гем test_after_commit
, если вы используете use_transactional_fixtures), чтобы при обновлении до новой версии Rails вы знали, работает ли он по-прежнему.
(Проверено 3.2.9)
Вместо наблюдателей теперь я использую ActiveSupport :: Concern и after_commit: blah, on:: create
работает там.