From 430b252d3d9bcf12951c2c58b744e83d43a34223 Mon Sep 17 00:00:00 2001
From: David Heinemeier Hansson <david@loudthinking.com>
Date: Sat, 2 Nov 2013 19:56:58 -0700
Subject: Revert "ActiveRecord::Base#<=> has been removed.  Primary keys may
 not be in order," -- will be replaced with a check to ensure that the keys
 used for comparison are integers, and only fail if they are not.

This reverts commit 6256734e2d0bdd89f4b5d11da259d40afa0c95c7.

Conflicts:
	activerecord/CHANGELOG.md
---
 activerecord/CHANGELOG.md              | 12 ------------
 activerecord/lib/active_record/core.rb |  9 +++++++++
 activerecord/test/cases/base_test.rb   |  7 +++++++
 3 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md
index f5b380b669..aa1e997ece 100644
--- a/activerecord/CHANGELOG.md
+++ b/activerecord/CHANGELOG.md
@@ -262,18 +262,6 @@
 
     *kennyj*
 
-*   ActiveRecord::Base#<=> has been removed.  Primary keys may not be in order,
-    or even be numbers, so sorting by id doesn't make sense.  Please use `sort_by`
-    and specify the attribute you wish to sort with.  For example, change:
-
-      Post.all.to_a.sort
-
-    to:
-
-      Post.all.to_a.sort_by(&:id)
-
-    *Aaron Patterson*
-
 *   Fix: joins association, with defined in the scope block constraints by using several
     where constraints and at least of them is not `Arel::Nodes::Equality`,
     generates invalid SQL expression.
diff --git a/activerecord/lib/active_record/core.rb b/activerecord/lib/active_record/core.rb
index 366ebde418..d9cb14e4c6 100644
--- a/activerecord/lib/active_record/core.rb
+++ b/activerecord/lib/active_record/core.rb
@@ -310,6 +310,15 @@ module ActiveRecord
       @attributes.frozen?
     end
 
+    # Allows sort on objects
+    def <=>(other_object)
+      if other_object.is_a?(self.class)
+        self.to_key <=> other_object.to_key
+      else
+        super
+      end
+    end
+
     # Returns +true+ if the record is read only. Records loaded through joins with piggy-back
     # attributes will be marked as read only since they cannot be saved.
     def readonly?
diff --git a/activerecord/test/cases/base_test.rb b/activerecord/test/cases/base_test.rb
index 82b20e8cee..d598eac26a 100644
--- a/activerecord/test/cases/base_test.rb
+++ b/activerecord/test/cases/base_test.rb
@@ -554,6 +554,13 @@ class BasicsTest < ActiveRecord::TestCase
     assert_equal [ Topic.find(1) ], [ Topic.find(2).topic ] & [ Topic.find(1) ]
   end
 
+  def test_comparison
+    topic_1 = Topic.create!
+    topic_2 = Topic.create!
+
+    assert_equal [topic_2, topic_1].sort, [topic_1, topic_2]
+  end
+
   def test_create_without_prepared_statement
     topic = Topic.connection.unprepared_statement do
       Topic.create(:title => 'foo')
-- 
cgit v1.2.3