mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Do not create useless database transaction when building has_one
association.
This commit is contained in:
parent
a002442fbc
commit
3cb0f3feed
3 changed files with 24 additions and 1 deletions
|
@ -1,5 +1,14 @@
|
|||
## Rails 4.0.0 (unreleased) ##
|
||||
|
||||
* Do not create useless database transaction when building `has_one` association.
|
||||
|
||||
Example:
|
||||
|
||||
User.has_one :profile
|
||||
User.new.build_profile
|
||||
|
||||
*Bogdan Gusiev*
|
||||
|
||||
* :counter_cache option for `has_many` associations to support custom named counter caches.
|
||||
Fix #7993
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ module ActiveRecord
|
|||
# If target and record are nil, or target is equal to record,
|
||||
# we don't need to have transaction.
|
||||
if (target || record) && target != record
|
||||
reflection.klass.transaction do
|
||||
transaction_if(save) do
|
||||
remove_target!(options[:dependent]) if target && !target.destroyed?
|
||||
|
||||
if record
|
||||
|
@ -90,6 +90,14 @@ module ActiveRecord
|
|||
def nullify_owner_attributes(record)
|
||||
record[reflection.foreign_key] = nil
|
||||
end
|
||||
|
||||
def transaction_if(value)
|
||||
if value
|
||||
reflection.klass.transaction { yield }
|
||||
else
|
||||
yield
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -206,6 +206,12 @@ class HasOneAssociationsTest < ActiveRecord::TestCase
|
|||
assert_equal account, firm.account
|
||||
end
|
||||
|
||||
def test_build_association_dont_create_transaction
|
||||
assert_no_queries {
|
||||
Firm.new.build_account
|
||||
}
|
||||
end
|
||||
|
||||
def test_build_and_create_should_not_happen_within_scope
|
||||
pirate = pirates(:blackbeard)
|
||||
scoped_count = pirate.association(:foo_bulb).scope.where_values.count
|
||||
|
|
Loading…
Reference in a new issue