mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
update_attributes and update_attributes! are now wrapped in a transaction
[#922 state:resovled] Signed-off-by: José Valim <jose.valim@gmail.com>
This commit is contained in:
@@ -121,15 +121,19 @@ module ActiveRecord
|
||||
# Updates all the attributes from the passed-in Hash and saves the record.
|
||||
# If the object is invalid, the saving will fail and false will be returned.
|
||||
def update_attributes(attributes)
|
||||
self.attributes = attributes
|
||||
save
|
||||
with_transaction_returning_status do
|
||||
self.attributes = attributes
|
||||
save
|
||||
end
|
||||
end
|
||||
|
||||
# Updates an object just like Base.update_attributes but calls save! instead
|
||||
# of save so an exception is raised if the record is invalid.
|
||||
def update_attributes!(attributes)
|
||||
self.attributes = attributes
|
||||
save!
|
||||
with_transaction_returning_status do
|
||||
self.attributes = attributes
|
||||
save!
|
||||
end
|
||||
end
|
||||
|
||||
# Initializes +attribute+ to zero if +nil+ and adds the value passed as +by+ (default is 1).
|
||||
|
||||
@@ -3,10 +3,12 @@ require 'models/topic'
|
||||
require 'models/reply'
|
||||
require 'models/developer'
|
||||
require 'models/book'
|
||||
require 'models/author'
|
||||
require 'models/post'
|
||||
|
||||
class TransactionTest < ActiveRecord::TestCase
|
||||
self.use_transactional_fixtures = false
|
||||
fixtures :topics, :developers
|
||||
fixtures :topics, :developers, :authors, :posts
|
||||
|
||||
def setup
|
||||
@first, @second = Topic.find(1, 2).sort_by { |t| t.id }
|
||||
@@ -103,6 +105,25 @@ class TransactionTest < ActiveRecord::TestCase
|
||||
end
|
||||
end
|
||||
|
||||
def test_update_attributes_should_rollback_on_failure
|
||||
author = Author.find(1)
|
||||
posts_count = author.posts.size
|
||||
assert posts_count > 0
|
||||
status = author.update_attributes(:name => nil, :post_ids => [])
|
||||
assert !status
|
||||
assert_equal posts_count, author.posts(true).size
|
||||
end
|
||||
|
||||
def test_update_attributes_should_rollback_on_failure!
|
||||
author = Author.find(1)
|
||||
posts_count = author.posts.size
|
||||
assert posts_count > 0
|
||||
assert_raise(ActiveRecord::RecordInvalid) do
|
||||
author.update_attributes!(:name => nil, :post_ids => [])
|
||||
end
|
||||
assert_equal posts_count, author.posts(true).size
|
||||
end
|
||||
|
||||
def test_cancellation_from_before_destroy_rollbacks_in_destroy
|
||||
add_cancelling_before_destroy_with_db_side_effect_to_topic
|
||||
begin
|
||||
|
||||
@@ -108,6 +108,8 @@ class Author < ActiveRecord::Base
|
||||
%w(twitter github)
|
||||
end
|
||||
|
||||
validates_presence_of :name
|
||||
|
||||
private
|
||||
def log_before_adding(object)
|
||||
@post_log << "before_adding#{object.id || '<new>'}"
|
||||
|
||||
Reference in New Issue
Block a user