From 10e7fadf15f0d698a9e3cb214b303bd602265905 Mon Sep 17 00:00:00 2001 From: Octavian Neamtu Date: Sat, 25 Apr 2015 15:07:54 -0400 Subject: [PATCH] Fix reverse not working on reordering, which broke calling reorder('...').last. --- CHANGELOG.md | 2 +- .../active_record/4.1/relation_extensions.rb | 2 +- .../active_record/relation_extensions_spec.rb | 20 +++++++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fb06f4..a629380 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ ## 1.2.4 (Unreleased) - +Fix reverse not working on reordering, which broke calling reorder('...').last. @oneamtu ## 1.2.3 (2015-2-5) * Support the latest version of Rails 4.2 and 4.1. By @danielrhodes diff --git a/lib/squeel/adapters/active_record/4.1/relation_extensions.rb b/lib/squeel/adapters/active_record/4.1/relation_extensions.rb index 38e9335..61513d4 100644 --- a/lib/squeel/adapters/active_record/4.1/relation_extensions.rb +++ b/lib/squeel/adapters/active_record/4.1/relation_extensions.rb @@ -225,7 +225,7 @@ def build_from def build_order(arel) orders = order_visit(dehashified_order_values) orders = orders.uniq.reject(&:blank?) - orders = reverse_sql_order(orders) if reverse_order_value && !reordering_value + orders = reverse_sql_order(orders) unless !reverse_order_value || (reordering_value && orders.empty?) arel.order(*orders) unless orders.empty? end diff --git a/spec/squeel/adapters/active_record/relation_extensions_spec.rb b/spec/squeel/adapters/active_record/relation_extensions_spec.rb index 0ea9667..e336381 100644 --- a/spec/squeel/adapters/active_record/relation_extensions_spec.rb +++ b/spec/squeel/adapters/active_record/relation_extensions_spec.rb @@ -918,6 +918,26 @@ module ActiveRecord block.to_sql.should match /ORDER BY #{Q}people#{Q}.#{Q}id#{Q}/ end + it 'returns the proper #first on reordering' do + queries = queries_for do + @standard.reorder{id.asc}.first + end + queries.size.should eq(1) + query = queries.first + query.should match /ORDER BY #{Q}people#{Q}.#{Q}id#{Q} ASC/ + query.should_not match /ORDER BY #{Q}people#{Q}.#{Q}id#{Q} DESC/ + end + + it 'returns the proper #last on reordering' do + queries = queries_for do + @standard.reorder{id.asc}.last + end + queries.size.should eq(1) + query = queries.last + query.should match /ORDER BY #{Q}people#{Q}.#{Q}id#{Q} DESC/ + query.should_not match /ORDER BY #{Q}people#{Q}.#{Q}id#{Q} ASC/ + end + it 'drops order by clause when passed nil' do block = @standard.reorder(nil) sql = block.to_sql