aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activerecord/CHANGELOG2
-rwxr-xr-xactiverecord/lib/active_record/associations.rb10
-rw-r--r--activerecord/lib/active_record/associations/association_proxy.rb4
-rwxr-xr-xactiverecord/test/associations_test.rb5
4 files changed, 14 insertions, 7 deletions
diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG
index af73c56991..a700efb112 100644
--- a/activerecord/CHANGELOG
+++ b/activerecord/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Cache nil results for has_one associations so multiple calls don't call the database. Closes #5757. [Michael A. Schoen]
+
* Add documentation for how to disable timestamps on a per model basis. Closes #5684. [matt@mattmargolis.net Marcel Molina Jr.]
* Don't save has_one associations unnecessarily. #5735 [Jonathan Viney]
diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb
index 009153d1d2..c803560413 100755
--- a/activerecord/lib/active_record/associations.rb
+++ b/activerecord/lib/active_record/associations.rb
@@ -656,7 +656,7 @@ module ActiveRecord
module_eval do
before_save <<-EOF
association = instance_variable_get("@#{reflection.name}")
- if !association.nil?
+ if association && association.target
if association.new_record?
association.save(true)
end
@@ -841,14 +841,14 @@ module ActiveRecord
if association.nil? || force_reload
association = association_proxy_class.new(self, reflection)
retval = association.reload
- unless retval.nil?
- instance_variable_set("@#{reflection.name}", association)
- else
+ if retval.nil? and association_proxy_class == BelongsToAssociation
instance_variable_set("@#{reflection.name}", nil)
return nil
end
+ instance_variable_set("@#{reflection.name}", association)
end
- association
+
+ association.target.nil? ? nil : association
end
define_method("#{reflection.name}=") do |new_value|
diff --git a/activerecord/lib/active_record/associations/association_proxy.rb b/activerecord/lib/active_record/associations/association_proxy.rb
index 46804a3b93..a94daccd34 100644
--- a/activerecord/lib/active_record/associations/association_proxy.rb
+++ b/activerecord/lib/active_record/associations/association_proxy.rb
@@ -126,13 +126,13 @@ module ActiveRecord
def load_target
if !@owner.new_record? || foreign_key_present
begin
- @target = find_target if !loaded?
+ @target = find_target unless loaded?
rescue ActiveRecord::RecordNotFound
reset
end
end
- loaded if target
+ loaded
target
end
diff --git a/activerecord/test/associations_test.rb b/activerecord/test/associations_test.rb
index eecb096521..f99322d976 100755
--- a/activerecord/test/associations_test.rb
+++ b/activerecord/test/associations_test.rb
@@ -96,6 +96,11 @@ class HasOneAssociationsTest < Test::Unit::TestCase
assert_equal Account.find(1).credit_limit, companies(:first_firm).account.credit_limit
end
+ def test_has_one_cache_nils
+ assert_nil companies(:another_firm).account
+ assert_queries(0) { companies(:another_firm).account }
+ end
+
def test_proxy_assignment
company = companies(:first_firm)
assert_nothing_raised { company.account = company.account }