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