From f379185a893503e26d160a4f326e610f05e3d6cc Mon Sep 17 00:00:00 2001
From: Aaron Patterson <aaron.patterson@gmail.com>
Date: Thu, 13 Jun 2013 10:49:29 -0700
Subject: reduce automatic_inverse_of caching logic

---
 activerecord/lib/active_record/reflection.rb | 46 ++++++++++------------------
 1 file changed, 16 insertions(+), 30 deletions(-)

(limited to 'activerecord')

diff --git a/activerecord/lib/active_record/reflection.rb b/activerecord/lib/active_record/reflection.rb
index 6eecc8252b..76eeae3160 100644
--- a/activerecord/lib/active_record/reflection.rb
+++ b/activerecord/lib/active_record/reflection.rb
@@ -296,15 +296,13 @@ module ActiveRecord
       alias :source_macro :macro
 
       def has_inverse?
-        @options[:inverse_of] || find_inverse_of_automatically
+        inverse_name
       end
 
       def inverse_of
-        @inverse_of ||= if options[:inverse_of]
-          klass.reflect_on_association(options[:inverse_of])
-        else
-          find_inverse_of_automatically
-        end
+        return unless inverse_name
+
+        @inverse_of ||= klass.reflect_on_association inverse_name
       end
 
       # Clears the cached value of +@inverse_of+ on this object. This will
@@ -393,26 +391,21 @@ module ActiveRecord
       INVALID_AUTOMATIC_INVERSE_OPTIONS = [:conditions, :through, :polymorphic, :foreign_key]
 
       private
-        # Attempts to find the inverse association automatically.
-        # If it cannot find a suitable inverse association, it returns
+        # Attempts to find the inverse association name automatically.
+        # If it cannot find a suitable inverse association name, it returns
         # nil.
-        def find_inverse_of_automatically
-          if @automatic_inverse_of == false
-            nil
-          elsif @automatic_inverse_of.nil?
-            set_automatic_inverse_of
-          else
-            klass.reflect_on_association(@automatic_inverse_of)
+        def inverse_name
+          options.fetch(:inverse_of) do
+            if @automatic_inverse_of == false
+              nil
+            else
+              @automatic_inverse_of = automatic_inverse_of
+            end
           end
         end
 
-        # Sets the +@automatic_inverse_of+ instance variable, and returns
-        # either nil or the inverse association that it finds.
-        #
-        # This method caches the inverse association that is found so that
-        # future calls to +find_inverse_of_automatically+ have much less
-        # overhead.
-        def set_automatic_inverse_of
+        # returns either nil or the inverse association name that it finds.
+        def automatic_inverse_of
           if can_find_inverse_of_automatically?(self)
             inverse_name = active_record.name.downcase.to_sym
 
@@ -425,15 +418,8 @@ module ActiveRecord
             end
 
             if valid_inverse_reflection?(reflection)
-              @automatic_inverse_of = inverse_name
-              reflection
-            else
-              @automatic_inverse_of = false
-              nil
+              inverse_name
             end
-          else
-            @automatic_inverse_of = false
-            nil
           end
         end
 
-- 
cgit v1.2.3