Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Merge pull request #8154 from bogdan/has_one_association_performance

Remove unwanted transaction when has one association is built
  • Loading branch information...
commit e803f3a521d34cdefa1d248beba34e2a9060603d 2 parents a002442 + 3cb0f3f
@carlosantoniodasilva carlosantoniodasilva authored
View
9 activerecord/CHANGELOG.md
@@ -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
View
10 activerecord/lib/active_record/associations/has_one_association.rb
@@ -28,7 +28,7 @@ def replace(record, save = true)
# 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 @@ def remove_target!(method)
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
View
6 activerecord/test/cases/associations/has_one_associations_test.rb
@@ -206,6 +206,12 @@ def test_successful_build_association
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
Please sign in to comment.
Something went wrong with that request. Please try again.