Rails 3: Как определить действие after_commit в наблюдателях? (создать / обновить / уничтожить)

У меня есть наблюдатель, и я регистрирую обратный вызов 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)

Обновление 2

Вместо наблюдателей теперь я использую ActiveSupport :: Concern и after_commit: blah, on:: create работает там.

61
задан paradoja 14 July 2015 в 11:18
поделиться