This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
Using Transactions in ActiveRecord | ||
---|---|---|
Code | Expected | Actual |
require 'cookbook_dbconnect' activerecord_connect # See chapter introduction class User < ActiveRecord::Base has_and_belongs_to_many :blog_posts end class BlogPost < ActiveRecord::Base has_and_belongs_to_many :authors, :class_name => 'User' end require 'active_record/transactions' class BlogPost def BlogPost.create_from_new_author(author_name, title, content) transaction do author = User.create(:name => author_name) raise 'Random failure!' if rand(2) == 0 create(:authors => [author], :title => title, :content => content) end end end BlogPost.create_from_new_author('Carol', 'The End Is Near', 'A few more facts of doom...') |
#<BlogPost:0xb78b7c7c ... > | #<BlogPost:0xb77ea8d4 @new_record_before_save=true, @errors=#<ActiveRecord::Errors:0xb77e8930 @errors={}, @base=#<BlogPost:0xb77ea8d4 ...>>, @attributes={"title"=>"The End Is Near", "id"=>16, "content"=>"A few more facts of doom..."}, @authors=[#<User:0xb77ecaf8 @new_record_before_save=true, @errors=#<ActiveRecord::Errors:0xb77ebc5c @errors={}, @base=#<User:0xb77ecaf8 ...>>, @attributes={"name"=>"Carol", "id"=>22}, @new_record=false>], @new_record=false> |
User.find(:first, :conditions=>"name='Carol'") |
#<User:0xb7888ae4 @attributes={"name"=>"Carol", ... }> | #<User:0xb77e3534 @attributes={"name"=>"Carol", "id"=>"2"}> |
BlogPost.create_from_new_author('David', 'The End: A Rebuttal', 'The end is actually quite far away...') |
RuntimeError: Random failure! The method failed; David's not in the database: |
Error! (Exception?) Here's stdout: RuntimeError: Random failure! from (irb):14:in `create_from_new_author' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.0/lib/active_record/connection_adapters/abstract/database_statements.rb:51:in `transaction' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.0/lib/active_record/transactions.rb:91:in `transaction' from (irb):12:in `create_from_new_author' from (irb):22 |
User.find(:first, :conditions=>"name='David'") |
nil | nil |