Transactions and new_record?
While working with the ActiveRecord method ‘new_record?’ and Transactions I ran into an odd issue after I had run a few objects through a Transaction. Although the transaction had rolled back and thus not saving the record, running ‘object_instance.new_record?’ resulted in a return of false as if the record had been saved to the database.
I also found the same issue recorded here: http://squarewheel.wordpress.com/2008/06/11/new_record/
Here is example code where the error will happen. Tested with Rails 3.1.0 & ActiveRecord 3.1.0
For this example I generated a new project
rails new rollback
rails g model Cat name:string purrr:string age:integer lives_left:integer
rake db:migrate
Then I can kick up a console session:
Cat.transaction do
@cat = Cat.new(name: 'Professor Wellington', purrr: 'meooow', age: 17, lives_left: 6)
@cat.save
raise Exception
end
#=> throws a big error
@cat.persisted?
#=> true
@cat.new_record?
#=> false
@cat.inspect
#=> <Cat id: 1, name: \"Professor Wellington\", purrr: 'meooow', age:
17, lives_left: 6, created_at: \"2013-02-02 00:20:44\", updated_at: \"2013-02-02 00:20:44\">
Cat.count
#=> 0
So even though the Professor was never actually saved to the database the ruby model acts as if it has been.
I didn’t revisit the issue until publishing this post (the current date is Feb 1, 2013) and have since found that in Rails 3.1.10 the issue has been resolved. I don’t know at what patch level the fix happend but it is no longer an issue.