<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -133,6 +133,7 @@ module ActiveRecord
       end
 
       private
+
         # Suffixes a, ?, c become regexp /(a|\?|c)$/
         def rebuild_attribute_method_regexp
           suffixes = attribute_method_suffixes.map { |s| Regexp.escape(s) }
@@ -238,19 +239,17 @@ module ActiveRecord
     def method_missing(method_id, *args, &amp;block)
       method_name = method_id.to_s
 
-      if self.class.private_method_defined?(method_name)
-        raise NoMethodError.new(&quot;Attempt to call private method&quot;, method_name, args)
-      end
-
       # If we haven't generated any methods yet, generate them, then
       # see if we've created the method we're looking for.
       if !self.class.generated_methods?
         self.class.define_attribute_methods
+        guard_private_attribute_method!(method_name, args)
         if self.class.generated_methods.include?(method_name)
           return self.send(method_id, *args, &amp;block)
         end
       end
       
+      guard_private_attribute_method!(method_name, args)
       if self.class.primary_key.to_s == method_name
         id
       elsif md = self.class.match_attribute_method?(method_name)
@@ -371,6 +370,12 @@ module ActiveRecord
     end
 
     private
+      # prevent method_missing from calling private methods with #send
+      def guard_private_attribute_method!(method_name, args)
+        if self.class.private_method_defined?(method_name)
+          raise NoMethodError.new(&quot;Attempt to call private method&quot;, method_name, args)
+        end
+      end
     
       def missing_attribute(attr_name, stack)
         raise ActiveRecord::MissingAttributeError, &quot;missing attribute: #{attr_name}&quot;, stack</diff>
      <filename>activerecord/lib/active_record/attribute_methods.rb</filename>
    </modified>
    <modified>
      <diff>@@ -277,6 +277,22 @@ class AttributeMethodsTest &lt; ActiveRecord::TestCase
     assert_raise(ActiveRecord::UnknownAttributeError) { @target.new.attributes = { :title =&gt; &quot;Ants in pants&quot; } }
   end
 
+  def test_read_attribute_overwrites_private_method_not_considered_implemented
+    # simulate a model with a db column that shares its name an inherited
+    # private method (e.g. Object#system)
+    #
+    Object.class_eval do
+      private
+      def title; &quot;private!&quot;; end
+    end
+    assert !@target.instance_method_already_implemented?(:title)
+    topic = @target.new
+    assert_equal nil, topic.title
+
+    Object.send(:undef_method, :title) # remove test method from object
+  end
+
+
   private
   def time_related_columns_on_topic
     Topic.columns.select{|c| [:time, :date, :datetime, :timestamp].include?(c.type)}.map(&amp;:name)</diff>
      <filename>activerecord/test/cases/attribute_methods_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>579250ea467ac406a5897dc2187c7959bf343b4f</id>
    </parent>
  </parents>
  <author>
    <name>Sam Goldstein</name>
    <email>sgrock@gmail.com</email>
  </author>
  <url>http://github.com/rails/rails/commit/d60d7edce462f4602bfc9996689087a235b034c9</url>
  <id>d60d7edce462f4602bfc9996689087a235b034c9</id>
  <committed-date>2009-07-08T21:44:30-07:00</committed-date>
  <authored-date>2009-07-08T11:45:26-07:00</authored-date>
  <message>Make it so AR attributes which conflict with object-private methods (e.g. system) don't 'randomly' cause NoMethodErrors

Previously if you called this attribute before others, you'd get exceptions.  But if it was the second-or-subsequent attribute you retrieved you'd get the correct behaviour.

Signed-off-by: Michael Koziarski &lt;michael@koziarski.com&gt;
[#2808 state:committed]</message>
  <tree>b56c9b8d07a87959fb8fbd746450537e46690ffb</tree>
  <committer>
    <name>Michael Koziarski</name>
    <email>michael@koziarski.com</email>
  </committer>
</commit>
