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) 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