У меня есть наблюдатель, и я регистрирую обратный вызов 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?
является хорошим показателем, хотя это частный метод, и вНаблюдатель должен получить к нему доступ #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
там работает.