Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails after_save callback being called multiple times

I'm trying to inject an after_save callback via a mixin, but my rspec tests are telling me that the callback is being called twice when the create method is called. Why is the method being called twice?

The following rspec test fails

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

The failure message is:

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

Here's the code

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

The Product class has other code, but does not have any other callbacks.

like image 391
Brian Glick Avatar asked Sep 29 '11 21:09

Brian Glick


1 Answers

after_save is part of the transaction and therefore may be called more than once provided that you have other associated objects that need to be saved as well. In cases like this I typically move from the after_save callback to the after_commit callback which runs only after the transaction has completed.

like image 96
heavysixer Avatar answered Oct 09 '22 08:10

heavysixer