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