From 0a2e37975d15310fab01b55a1e3858f137dcd685 Mon Sep 17 00:00:00 2001
From: Jon Leighton <j@jonathanleighton.com>
Date: Fri, 23 Dec 2011 20:31:24 +0000
Subject: Fix situation where id method didn't get defined causing postgres to
 fail

---
 activerecord/lib/active_record/attribute_methods.rb | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

(limited to 'activerecord/lib')

diff --git a/activerecord/lib/active_record/attribute_methods.rb b/activerecord/lib/active_record/attribute_methods.rb
index 20cb98f033..883440542d 100644
--- a/activerecord/lib/active_record/attribute_methods.rb
+++ b/activerecord/lib/active_record/attribute_methods.rb
@@ -65,7 +65,9 @@ module ActiveRecord
         if superclass == Base
           super
         else
-          method_defined_within?(method_name, superclass, superclass.generated_attribute_methods) || super
+          # If B < A and A defines its own attribute method, then we don't want to overwrite that.
+          defined = method_defined_within?(method_name, superclass, superclass.generated_attribute_methods)
+          defined && !ActiveRecord::Base.method_defined?(method_name) || super
         end
       end
 
@@ -75,9 +77,6 @@ module ActiveRecord
         method_defined_within?(name, Base)
       end
 
-      # Note that we could do this via klass.instance_methods(false), but this would require us
-      # to maintain a cached Set (for speed) and invalidate it at the correct time, which would
-      # be a pain. This implementation is also O(1) while avoiding maintaining a cached Set.
       def method_defined_within?(name, klass, sup = klass.superclass)
         if klass.method_defined?(name) || klass.private_method_defined?(name)
           if sup.method_defined?(name) || sup.private_method_defined?(name)
-- 
cgit v1.2.3