Rails after_save вызывается несколько раз - PullRequest
10 голосов
/ 30 сентября 2011

Я пытаюсь ввести обратный вызов after_save через миксин, но мои тесты rspec сообщают мне, что обратный вызов вызывается дважды при вызове метода create. Почему метод вызывается дважды?

Следующий тест rspec не пройден

it 'should call callback' do
  Product.any_instance.should_receive(:update_linkable_attachments).once
  Product.create(:name=>'abc')
end

Сообщение об ошибке:

Failure/Error: Unable to find matching line from backtrace
   (#<Product:0xb7db738>).update_linkable_attachments(any args)
       expected: 1 time
       received: 2 times

Вот код

module MainModuleSupport
  def self.included(base)
    base.instance_eval("after_save :update_linkable_attachments")
  end 

  def update_linkable_attachments
    LinkedAttachment.delay.create_from_attachment self
  end
end

class Product < ActiveRecord::Base
  include MainModuleSupport
  ...

end

Класс Product имеет другой код, но не имеет других обратных вызовов.

1 Ответ

7 голосов
/ 07 ноября 2011

after_save является частью транзакции и, следовательно, может вызываться более одного раза при условии, что у вас есть другие связанные объекты, которые также необходимо сохранить.В подобных случаях я обычно перехожу от обратного вызова after_save к обратному вызову after_commit, который запускается только после завершения транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...