From 5ada3c217001895728347296e1bb504e6db532b0 Mon Sep 17 00:00:00 2001 From: =?utf-8?q?Johannes=20Th=C3=B6nes?= Date: Thu, 21 Aug 2008 14:19:14 +0200 Subject: [PATCH 1/1] <=> Method used to order find results if available and :order not specified --- activerecord/lib/active_record/base.rb | 1 + activerecord/test/cases/finder_test.rb | 14 +++++++++++++- activerecord/test/fixtures/computers.yml | 6 ++++++ activerecord/test/models/computer.rb | 5 +++++ 4 files changed, 25 insertions(+), 1 deletions(-) diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index 5357255..4acb3a2 100644 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -1391,6 +1391,7 @@ module ActiveRecord #:nodoc: end records.each { |record| record.readonly! } if options[:readonly] + records.sort! if !(options.member?(:order)) && public_instance_methods.member?("<=>") records end diff --git a/activerecord/test/cases/finder_test.rb b/activerecord/test/cases/finder_test.rb index b97db73..5ab21ab 100644 --- a/activerecord/test/cases/finder_test.rb +++ b/activerecord/test/cases/finder_test.rb @@ -11,9 +11,10 @@ require 'models/post' require 'models/customer' require 'models/job' require 'models/categorization' +require 'models/computer' class FinderTest < ActiveRecord::TestCase - fixtures :companies, :topics, :entrants, :developers, :developers_projects, :posts, :comments, :accounts, :authors, :customers + fixtures :companies, :topics, :entrants, :developers, :developers_projects, :posts, :comments, :accounts, :authors, :customers, :computers def test_find assert_equal(topics(:first).title, Topic.find(1).title) @@ -896,6 +897,17 @@ class FinderTest < ActiveRecord::TestCase assert_equal [0, 1, 1], posts.map(&:author_id).sort end + + def test_find_all_with_ruby_orderings + computers = Computer.find(:all) + assert_equal (1..8).to_a, computers.collect {|c| c.extendedWarranty} + end + + def test_find_all_with_ruby_orderings_overriden_by_order + computers = Computer.find(:all, :order => 'extendedWarranty DESC') + assert_equal (1..8).to_a.reverse, computers.collect {|c| c.extendedWarranty} + end + protected def bind(statement, *vars) if vars.first.is_a?(Hash) diff --git a/activerecord/test/fixtures/computers.yml b/activerecord/test/fixtures/computers.yml index daf969d..034cd07 100644 --- a/activerecord/test/fixtures/computers.yml +++ b/activerecord/test/fixtures/computers.yml @@ -2,3 +2,9 @@ workstation: id: 1 developer: 1 extendedWarranty: 1 + +<% [5,8,6,7,3,4,2].each do |wty| %> +<%= "comp_with_#{wty}_year_warraty" %>: + developer: 1 + extendedWarranty: <%= wty %> +<% end %> diff --git a/activerecord/test/models/computer.rb b/activerecord/test/models/computer.rb index cc8deb1..513abbc 100644 --- a/activerecord/test/models/computer.rb +++ b/activerecord/test/models/computer.rb @@ -1,3 +1,8 @@ class Computer < ActiveRecord::Base belongs_to :developer, :foreign_key=>'developer' + + public + def <=>(other) + extendedWarranty <=> other.extendedWarranty + end end -- 1.5.4.3