diff options
author | Rick Olson <technoweenie@gmail.com> | 2006-08-08 16:59:06 +0000 |
---|---|---|
committer | Rick Olson <technoweenie@gmail.com> | 2006-08-08 16:59:06 +0000 |
commit | 94a1309194fa5962e33d395ede14e94b237c54f5 (patch) | |
tree | 33c1e6edbe2297e9f19206c18480db5b76bafd84 | |
parent | 2ce49e7dd56515491238ccb7961987ea82055105 (diff) | |
download | rails-94a1309194fa5962e33d395ede14e94b237c54f5.tar.gz rails-94a1309194fa5962e33d395ede14e94b237c54f5.tar.bz2 rails-94a1309194fa5962e33d395ede14e94b237c54f5.zip |
Cache nil results for has_one associations so multiple calls don't call the database. Closes #5757. [Michael A. Schoen]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4721 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
-rw-r--r-- | activerecord/CHANGELOG | 2 | ||||
-rwxr-xr-x | activerecord/lib/active_record/associations.rb | 10 | ||||
-rw-r--r-- | activerecord/lib/active_record/associations/association_proxy.rb | 4 | ||||
-rwxr-xr-x | activerecord/test/associations_test.rb | 5 |
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 } |