From 2c30c9fe6c22f0342aa0be3909efa3a5787dc33d Mon Sep 17 00:00:00 2001
From: Joshua Peek <josh@joshpeek.com>
Date: Thu, 30 Jul 2009 14:05:08 -0500
Subject: Undefine id and let it automatically be generated

---
 activerecord/lib/active_record/attribute_methods.rb      |  8 ++++----
 activerecord/lib/active_record/attribute_methods/read.rb | 13 ++-----------
 2 files changed, 6 insertions(+), 15 deletions(-)

(limited to 'activerecord/lib')

diff --git a/activerecord/lib/active_record/attribute_methods.rb b/activerecord/lib/active_record/attribute_methods.rb
index 3eeb7fb4e9..4c9ea050c4 100644
--- a/activerecord/lib/active_record/attribute_methods.rb
+++ b/activerecord/lib/active_record/attribute_methods.rb
@@ -77,6 +77,9 @@ module ActiveRecord
             end
           end
         end
+        unless generated_methods.include?("id")
+          define_read_method(:id, primary_key, columns_hash[primary_key.to_s])
+        end
       end
 
       def undefine_attribute_methods
@@ -89,7 +92,6 @@ module ActiveRecord
       # method is defined by Active Record though.
       def instance_method_already_implemented?(method_name)
         method_name = method_name.to_s
-        return true if method_name == "id"
         @_defined_class_methods         ||= ancestors.first(ancestors.index(ActiveRecord::Base)).sum([]) { |m| m.public_instance_methods(false) | m.private_instance_methods(false) | m.protected_instance_methods(false) }.map {|m| m.to_s }.to_set
         @@_defined_activerecord_methods ||= (ActiveRecord::Base.public_instance_methods(false) | ActiveRecord::Base.private_instance_methods(false) | ActiveRecord::Base.protected_instance_methods(false)).map{|m| m.to_s }.to_set
         raise DangerousAttributeError, "#{method_name} is defined by ActiveRecord" if @@_defined_activerecord_methods.include?(method_name)
@@ -109,9 +111,7 @@ module ActiveRecord
 
         # Evaluate the definition for an attribute related method
         def evaluate_attribute_method(attr_name, method_definition, method_name)
-          unless method_name.to_s == primary_key.to_s
-            generated_methods << method_name
-          end
+          generated_methods << method_name
 
           begin
             class_eval(method_definition, __FILE__, __LINE__)
diff --git a/activerecord/lib/active_record/attribute_methods/read.rb b/activerecord/lib/active_record/attribute_methods/read.rb
index a3327dc083..2ea09499c5 100644
--- a/activerecord/lib/active_record/attribute_methods/read.rb
+++ b/activerecord/lib/active_record/attribute_methods/read.rb
@@ -5,6 +5,7 @@ module ActiveRecord
 
       included do
         attribute_method_suffix ""
+        undef_method :id
       end
 
       module ClassMethods
@@ -54,7 +55,7 @@ module ActiveRecord
             if cache_attribute?(attr_name)
               access_code = "@attributes_cache['#{attr_name}'] ||= (#{access_code})"
             end
-            evaluate_attribute_method attr_name, "def #{symbol}; #{access_code}; end", attr_name
+            evaluate_attribute_method attr_name, "def #{symbol}; #{access_code}; end", symbol
           end
       end
 
@@ -78,16 +79,6 @@ module ActiveRecord
         end
       end
 
-      # A model instance's primary key is always available as model.id
-      # whether you name it the default 'id' or set it to something else.
-      def id
-        attr_name = self.class.primary_key
-        column = column_for_attribute(attr_name)
-
-        self.class.send(:define_read_method, :id, attr_name, column)
-        id
-      end
-
       # Returns true if the attribute is of a text column and marked for serialization.
       def unserializable_attribute?(attr_name, column)
         column.text? && self.class.serialized_attributes[attr_name]
-- 
cgit v1.2.3