Skip to content

Commit 0477527

Browse files
authored
Merge pull request rails#54607 from joshuay03/respect-order-columns-in-reverse-order
Ensure `#reverse_order` respects `implicit_order_column`
2 parents 7845576 + e724ad0 commit 0477527

File tree

4 files changed

+30
-3
lines changed

4 files changed

+30
-3
lines changed

activerecord/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
* Respect `implicit_order_column` in `ActiveRecord::Relation#reverse_order`.
2+
3+
*Joshua Young*
4+
15
* Add column types to `ActiveRecord::Result` for SQLite3.
26

37
*Andrew Kane*

activerecord/lib/active_record/relation/finder_methods.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -638,7 +638,7 @@ def find_last(limit)
638638
end
639639

640640
def ordered_relation
641-
if order_values.empty? && (model.implicit_order_column || !model.query_constraints_list.nil? || primary_key)
641+
if order_values.empty? && !_order_columns.empty?
642642
order(_order_columns.map { |column| table[column].asc })
643643
else
644644
self

activerecord/lib/active_record/relation/query_methods.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2009,9 +2009,12 @@ def table_name_matches?(from)
20092009

20102010
def reverse_sql_order(order_query)
20112011
if order_query.empty?
2012-
return [table[primary_key].desc] if primary_key
2012+
if !_reverse_order_columns.empty?
2013+
return _reverse_order_columns.map { |column| table[column].desc }
2014+
end
2015+
20132016
raise IrreversibleOrderError,
2014-
"Relation has no current order and table has no primary key to be used as default order"
2017+
"Relation has no current order and table has no order columns to be used as default order"
20152018
end
20162019

20172020
order_query.flat_map do |o|
@@ -2036,6 +2039,13 @@ def reverse_sql_order(order_query)
20362039
end
20372040
end
20382041

2042+
def _reverse_order_columns
2043+
roc = []
2044+
roc << model.implicit_order_column if model.implicit_order_column
2045+
roc << model.primary_key if model.primary_key
2046+
roc.flatten.uniq.compact
2047+
end
2048+
20392049
def does_not_support_reverse?(order)
20402050
# Account for String subclasses like Arel::Nodes::SqlLiteral that
20412051
# override methods like #count.

activerecord/test/cases/relations_test.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,19 @@ def test_default_reverse_order_on_table_without_primary_key
370370
end
371371
end
372372

373+
def test_default_reverse_order_on_table_without_primary_key_with_implicit_order_column
374+
ordered_edge = Class.new(Edge) do
375+
self.implicit_order_column = "source_id"
376+
end
377+
378+
ordered_edge.delete_all
379+
380+
edge_1 = ordered_edge.create!(source_id: 1, sink_id: 2)
381+
edge_2 = ordered_edge.create!(source_id: 2, sink_id: 3)
382+
assert_equal edge_1.source_id, ordered_edge.all.first.source_id
383+
assert_equal edge_2.source_id, ordered_edge.all.reverse_order.first.source_id
384+
end
385+
373386
def test_order_with_hash_and_symbol_generates_the_same_sql
374387
assert_equal Topic.order(:id).to_sql, Topic.order(id: :asc).to_sql
375388
end

0 commit comments

Comments
 (0)