Skip to content

Commit 1c7a754

Browse files
Neeraj Singhspastorino
authored andcommitted
order should always be concatenated.
order that is declared first has highest priority in all cases. Here are some examples. Car.order('name desc').find(:first, :order => 'id').name Car.named_scope_with_order.named_scope_with_another_order Car.order('id DESC').scoping do Car.find(:first, :order => 'id asc') end No special treatment to with_scope or scoping. Also note that if default_scope declares an order then the order declared in default_scope has the highest priority unless with_exclusive_scope is used. Signed-off-by: Santiago Pastorino <santiago@wyeworks.com>
1 parent 2988751 commit 1c7a754

File tree

6 files changed

+35
-8
lines changed

6 files changed

+35
-8
lines changed

activerecord/lib/active_record/relation/spawn_methods.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,8 @@ def apply_finder_options(options)
9999

100100
relation = relation.readonly(options[:readonly]) if options.key? :readonly
101101

102-
# Give precedence to newly-applied orders and groups to play nicely with with_scope
103102
[:group, :order].each do |finder|
104-
relation.send("#{finder}_values=", Array.wrap(options[finder]) + relation.send("#{finder}_values")) if options.has_key?(finder)
103+
relation.send("#{finder}_values=", relation.send("#{finder}_values") + Array.wrap(options[finder])) if options.has_key?(finder)
105104
end
106105

107106
relation = relation.where(options[:conditions]) if options.has_key?(:conditions)

activerecord/test/cases/base_test.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1139,18 +1139,18 @@ def test_scoped_find_order
11391139
scoped_developers = Developer.send(:with_scope, :find => { :limit => 1 }) do
11401140
Developer.find(:all, :order => 'salary DESC')
11411141
end
1142-
# Test scope order + find order, find has priority
1142+
# Test scope order + find order, order has priority
11431143
scoped_developers = Developer.send(:with_scope, :find => { :limit => 3, :order => 'id DESC' }) do
11441144
Developer.find(:all, :order => 'salary ASC')
11451145
end
11461146
assert scoped_developers.include?(developers(:poor_jamis))
1147-
assert scoped_developers.include?(developers(:david))
1147+
assert ! scoped_developers.include?(developers(:david))
11481148
assert ! scoped_developers.include?(developers(:jamis))
11491149
assert_equal 3, scoped_developers.size
11501150

11511151
# Test without scoped find conditions to ensure we get the right thing
1152-
developers = Developer.find(:all, :order => 'id', :limit => 1)
1153-
assert scoped_developers.include?(developers(:david))
1152+
assert ! scoped_developers.include?(Developer.find(1))
1153+
assert scoped_developers.include?(Developer.find(11))
11541154
end
11551155

11561156
def test_scoped_find_limit_offset_including_has_many_association

activerecord/test/cases/relation_scoping_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -398,8 +398,8 @@ def test_nested_exclusive_scope
398398
assert_equal expected, received
399399
end
400400

401-
def test_overwriting_default_scope
402-
expected = Developer.find(:all, :order => 'salary').collect { |dev| dev.salary }
401+
def test_order_in_default_scope_should_prevail
402+
expected = Developer.find(:all, :order => 'salary desc').collect { |dev| dev.salary }
403403
received = DeveloperOrderedBySalary.find(:all, :order => 'salary').collect { |dev| dev.salary }
404404
assert_equal expected, received
405405
end

activerecord/test/cases/relations_test.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -667,4 +667,22 @@ def test_order_by_relation_attribute
667667
def test_relations_limit_with_conditions_or_limit
668668
assert_equal Post.limit(2).size, Post.limit(2).all.size
669669
end
670+
671+
def test_order_with_find_with_order
672+
assert_equal 'zyke', Car.order('name desc').find(:first, :order => 'id').name
673+
end
674+
675+
def test_default_scope_order_with_named_scope_order
676+
assert_equal 'zyke', Car.order_using_new_style.limit(1).first.name
677+
assert_equal 'zyke', Car.order_using_old_style.limit(1).first.name
678+
end
679+
680+
def test_order_using_scoping
681+
car = Car.order('id DESC').scoping do
682+
Car.find(:first, :order => 'id asc')
683+
end
684+
assert_equal 'zyke', car.name
685+
end
686+
687+
670688
end

activerecord/test/fixtures/cars.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,8 @@ honda:
22
id: 1
33
name: honda
44
engines_count: 0
5+
6+
zyke:
7+
id: 2
8+
name: zyke
9+
engines_count: 0

activerecord/test/models/car.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,9 @@ class Car < ActiveRecord::Base
77
scope :incl_tyres, includes(:tyres)
88
scope :incl_engines, includes(:engines)
99

10+
default_scope :order => 'name desc'
11+
12+
scope :order_using_new_style, order('name asc')
13+
scope :order_using_old_style, :order => 'name asc'
14+
1015
end

0 commit comments

Comments
 (0)