Wrap calls to update_attributes in a transaction.
Signed-off-by: Michael Koziarski <michael@koziarski.com> [#922 state:committed]
This commit is contained in:
parent
f4391c362d
commit
fc09ebc669
|
@ -10,7 +10,7 @@ module ActiveRecord
|
|||
base.extend(ClassMethods)
|
||||
|
||||
base.class_eval do
|
||||
[:destroy, :save, :save!].each do |method|
|
||||
[:destroy, :save, :save!, :update_attribute, :update_attributes, :update_attributes!].each do |method|
|
||||
alias_method_chain method, :transactions
|
||||
end
|
||||
end
|
||||
|
@ -200,6 +200,20 @@ module ActiveRecord
|
|||
rollback_active_record_state! { self.class.transaction { save_without_transactions! } }
|
||||
end
|
||||
|
||||
def update_attribute_with_transactions(name, value)
|
||||
with_transaction_returning_status(:update_attribute_without_transactions, name, value)
|
||||
end
|
||||
|
||||
def update_attributes_with_transactions(attributes)
|
||||
with_transaction_returning_status(:update_attributes_without_transactions, attributes)
|
||||
end
|
||||
|
||||
def update_attributes_with_transactions!(attributes)
|
||||
transaction do
|
||||
update_attributes_without_transactions!(attributes)
|
||||
end
|
||||
end
|
||||
|
||||
# Reset id and @new_record if the transaction rolls back.
|
||||
def rollback_active_record_state!
|
||||
id_present = has_attribute?(self.class.primary_key)
|
||||
|
|
|
@ -182,6 +182,40 @@ class TransactionTest < ActiveRecord::TestCase
|
|||
end
|
||||
end
|
||||
|
||||
def test_update_attribute_should_rollback_on_failure
|
||||
Developer.before_save do
|
||||
false
|
||||
end
|
||||
developer = Developer.first
|
||||
developer.audit_logs.clear
|
||||
2.times { developer.audit_logs.create(:message => 'message') }
|
||||
assert_equal 2, developer.audit_logs.size
|
||||
status = developer.update_attribute(:audit_log_ids, [])
|
||||
assert !status
|
||||
assert_equal 2, developer.audit_logs(true).size
|
||||
end
|
||||
|
||||
def test_update_attributes_should_rollback_on_failure
|
||||
developer = Developer.first
|
||||
developer.audit_logs.clear
|
||||
2.times { developer.audit_logs.create(:message => 'message') }
|
||||
assert_equal 2, developer.audit_logs.size
|
||||
status = developer.update_attributes(:audit_log_ids => [], :name => nil)
|
||||
assert !status
|
||||
assert_equal 2, developer.audit_logs(true).size
|
||||
end
|
||||
|
||||
def test_update_attributes_should_rollback_on_failure!
|
||||
developer = Developer.first
|
||||
developer.audit_logs.clear
|
||||
2.times { developer.audit_logs.create(:message => 'message') }
|
||||
assert_equal 2, developer.audit_logs.size
|
||||
assert_raise(ActiveRecord::RecordInvalid) do
|
||||
developer.update_attributes!(:audit_log_ids => [], :name => nil)
|
||||
end
|
||||
assert_equal 2, developer.audit_logs(true).size
|
||||
end
|
||||
|
||||
def test_nested_explicit_transactions
|
||||
Topic.transaction do
|
||||
Topic.transaction do
|
||||
|
|
Loading…
Reference in New Issue