Skip to content
This repository has been archived by the owner on Mar 30, 2022. It is now read-only.

fix for last being broken with reorder descending #337

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions lib/squeel/adapters/active_record/relation_extensions.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down