Skip to content

Commit

Permalink
Fix issue #1272
Browse files Browse the repository at this point in the history
Set reverse_order_value when asked to reverse_order().
Do the actual reversal in build_arel.
  • Loading branch information
counterleft authored and jonleighton committed Jun 1, 2011
1 parent fba977d commit 1e43bd9
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 10 deletions.
2 changes: 1 addition & 1 deletion activerecord/lib/active_record/relation.rb
Expand Up @@ -6,7 +6,7 @@ class Relation
JoinOperation = Struct.new(:relation, :join_class, :on)
ASSOCIATION_METHODS = [:includes, :eager_load, :preload]
MULTI_VALUE_METHODS = [:select, :group, :order, :joins, :where, :having, :bind]
SINGLE_VALUE_METHODS = [:limit, :offset, :lock, :readonly, :create_with, :from, :reorder]
SINGLE_VALUE_METHODS = [:limit, :offset, :lock, :readonly, :create_with, :from, :reorder, :reverse_order]

include FinderMethods, Calculations, SpawnMethods, QueryMethods, Batches

Expand Down
15 changes: 7 additions & 8 deletions activerecord/lib/active_record/relation/query_methods.rb
Expand Up @@ -9,7 +9,7 @@ module QueryMethods
:select_values, :group_values, :order_values, :joins_values,
:where_values, :having_values, :bind_values,
:limit_value, :offset_value, :lock_value, :readonly_value, :create_with_value,
:from_value, :reorder_value
:from_value, :reorder_value, :reverse_order_value

def includes(*args)
args.reject! {|a| a.blank? }
Expand Down Expand Up @@ -158,13 +158,9 @@ def extending(*modules)
end

def reverse_order
order_clause = arel.order_clauses

order = order_clause.empty? ?
"#{table_name}.#{primary_key} DESC" :
reverse_sql_order(order_clause).join(', ')

except(:order).order(Arel.sql(order))
relation = clone
relation.reverse_order_value = !relation.reverse_order_value
relation
end

def arel
Expand All @@ -186,6 +182,7 @@ def build_arel
arel.group(*@group_values.uniq.reject{|g| g.blank?}) unless @group_values.empty?

order = @reorder_value ? @reorder_value : @order_values
order = reverse_sql_order(order) if @reverse_order_value
arel.order(*order.uniq.reject{|o| o.blank?}) unless order.empty?

build_select(arel, @select_values.uniq)
Expand Down Expand Up @@ -306,6 +303,8 @@ def apply_modules(modules)
end

def reverse_sql_order(order_query)
order_query = ["#{quoted_table_name}.#{quoted_primary_key} ASC"] if order_query.empty?

order_query.join(', ').split(',').collect do |s|
s.gsub!(/\sasc\Z/i, ' DESC') || s.gsub!(/\sdesc\Z/i, ' ASC') || s.concat(' DESC')
end
Expand Down
15 changes: 15 additions & 0 deletions activerecord/test/cases/relation_scoping_test.rb
Expand Up @@ -11,6 +11,14 @@
class RelationScopingTest < ActiveRecord::TestCase
fixtures :authors, :developers, :projects, :comments, :posts, :developers_projects

def test_reverse_order
assert_equal Developer.order("id DESC").to_a.reverse, Developer.order("id DESC").reverse_order
end

def test_double_reverse_order_produces_original_order
assert_equal Developer.order("name DESC"), Developer.order("name DESC").reverse_order.reverse_order
end

def test_scoped_find
Developer.where("name = 'David'").scoping do
assert_nothing_raised { Developer.find(1) }
Expand Down Expand Up @@ -483,4 +491,11 @@ def test_default_scope_select_ignored_by_grouped_aggregations
def test_default_scope_order_ignored_by_aggregations
assert_equal DeveloperOrderedBySalary.all.count, DeveloperOrderedBySalary.count
end

def test_default_scope_find_last
assert DeveloperOrderedBySalary.count > 1, "need more than one row for test"

lowest_salary_dev = DeveloperOrderedBySalary.find(developers(:poor_jamis).id)
assert_equal lowest_salary_dev, DeveloperOrderedBySalary.last
end
end
2 changes: 1 addition & 1 deletion activerecord/test/cases/relation_test.rb
Expand Up @@ -20,7 +20,7 @@ def test_construction
end

def test_single_values
assert_equal [:limit, :offset, :lock, :readonly, :create_with, :from, :reorder].map(&:to_s).sort,
assert_equal [:limit, :offset, :lock, :readonly, :create_with, :from, :reorder, :reverse_order].map(&:to_s).sort,
Relation::SINGLE_VALUE_METHODS.map(&:to_s).sort
end

Expand Down

0 comments on commit 1e43bd9

Please sign in to comment.