From 746d66b5f3450068538d754c2448ee342a0972aa Mon Sep 17 00:00:00 2001 From: "Andrew S. Brown" Date: Tue, 9 Sep 2014 16:58:26 -0700 Subject: [PATCH 1/2] add spec that shows that reorder is broken --- .../adapters/active_record/relation_extensions_spec.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spec/squeel/adapters/active_record/relation_extensions_spec.rb b/spec/squeel/adapters/active_record/relation_extensions_spec.rb index 3ccce75..9dc7a71 100644 --- a/spec/squeel/adapters/active_record/relation_extensions_spec.rb +++ b/spec/squeel/adapters/active_record/relation_extensions_spec.rb @@ -221,6 +221,14 @@ module ActiveRecord ordered.to_sql.scan('name').should have(1).item end + it 'returns the first item when #last is called after reversing the order' do + sorted_people = Person.all.to_a.sort {|a, b| a.name.downcase <=> b.name.downcase} + Person.order(name: :desc).first.should eq sorted_people.last + Person.order(name: :desc).last.should eq sorted_people.first + Person.reorder(name: :desc).first.should eq sorted_people.last + Person.reorder(:name).reverse_order.last.should eq sorted_people.first + Person.reorder(name: :desc).last.should eq sorted_people.first # this fails + end end describe '#to_sql' do From 4386e60186cc27d473ad56d2540471b62a56bd1a Mon Sep 17 00:00:00 2001 From: "Andrew S. Brown" Date: Tue, 9 Sep 2014 17:47:40 -0700 Subject: [PATCH 2/2] speculative fix for reordering problem --- lib/squeel/adapters/active_record/4.1/relation_extensions.rb | 2 +- lib/squeel/adapters/active_record/relation_extensions.rb | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) 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 ce88574..f49f93e 100644 --- a/lib/squeel/adapters/active_record/4.1/relation_extensions.rb +++ b/lib/squeel/adapters/active_record/4.1/relation_extensions.rb @@ -226,7 +226,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) if reverse_order_value arel.order(*orders) unless orders.empty? end diff --git a/lib/squeel/adapters/active_record/relation_extensions.rb b/lib/squeel/adapters/active_record/relation_extensions.rb index 18e5357..e8646c0 100644 --- a/lib/squeel/adapters/active_record/relation_extensions.rb +++ b/lib/squeel/adapters/active_record/relation_extensions.rb @@ -216,6 +216,11 @@ def reorder(*args) end end + def reorder!(*args) + self.reverse_order_value = false + super + end + def joins(*args) if block_given? && args.empty? super(DSL.eval &Proc.new)