From 430b252d3d9bcf12951c2c58b744e83d43a34223 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 2 Nov 2013 19:56:58 -0700 Subject: [PATCH] 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')