From f01f03e96390fb493830337571de578241619d4f Mon Sep 17 00:00:00 2001
From: Larry Lv <larrylv1990@gmail.com>
Date: Fri, 8 Mar 2013 03:37:01 +0800
Subject: @target might be nil when Identity Map is enabled.

* With Identity Map enabled, NameError might be raised and @target is
  nil. So we should always ensure `@target ||= find_target`.

* Only force reload target when it is stale.
---
 activerecord/lib/active_record/associations/association.rb | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

(limited to 'activerecord/lib')

diff --git a/activerecord/lib/active_record/associations/association.rb b/activerecord/lib/active_record/associations/association.rb
index 861df46e3c..99f307922e 100644
--- a/activerecord/lib/active_record/associations/association.rb
+++ b/activerecord/lib/active_record/associations/association.rb
@@ -129,8 +129,11 @@ module ActiveRecord
       # This method is abstract in the sense that it relies on +find_target+,
       # which is expected to be provided by descendants.
       #
-      # If the \target is already \loaded it is just returned. Thus, you can call
-      # +load_target+ unconditionally to get the \target.
+      # If the \target is stale(the target no longer points to the record(s) that the
+      # relevant foreign_key(s) refers to.), force reload the \target.
+      #
+      # Otherwise if the \target is already \loaded it is just returned. Thus, you can
+      # call +load_target+ unconditionally to get the \target.
       #
       # ActiveRecord::RecordNotFound is rescued within the method, and it is
       # not reraised. The proxy is \reset and +nil+ is the return value.
@@ -139,11 +142,13 @@ module ActiveRecord
           begin
             if IdentityMap.enabled? && association_class && association_class.respond_to?(:base_class)
               @target = IdentityMap.get(association_class, owner[reflection.foreign_key])
-            else
+            elsif @stale_state && stale_target?
               @target = find_target
             end
           rescue NameError
             nil
+          ensure
+            @target ||= find_target
           end
         end
         loaded! unless loaded?
-- 
cgit v1.2.3