 
 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 |