File tree Expand file tree Collapse file tree 4 files changed +30
-3
lines changed
lib/active_record/relation Expand file tree Collapse file tree 4 files changed +30
-3
lines changed Original file line number Diff line number Diff line change
1
+ * Respect ` implicit_order_column ` in ` ActiveRecord::Relation#reverse_order ` .
2
+
3
+ * Joshua Young*
4
+
1
5
* Add column types to ` ActiveRecord::Result ` for SQLite3.
2
6
3
7
* Andrew Kane*
Original file line number Diff line number Diff line change @@ -638,7 +638,7 @@ def find_last(limit)
638
638
end
639
639
640
640
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?
642
642
order ( _order_columns . map { |column | table [ column ] . asc } )
643
643
else
644
644
self
Original file line number Diff line number Diff line change @@ -2009,9 +2009,12 @@ def table_name_matches?(from)
2009
2009
2010
2010
def reverse_sql_order ( order_query )
2011
2011
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
+
2013
2016
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"
2015
2018
end
2016
2019
2017
2020
order_query . flat_map do |o |
@@ -2036,6 +2039,13 @@ def reverse_sql_order(order_query)
2036
2039
end
2037
2040
end
2038
2041
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
+
2039
2049
def does_not_support_reverse? ( order )
2040
2050
# Account for String subclasses like Arel::Nodes::SqlLiteral that
2041
2051
# override methods like #count.
Original file line number Diff line number Diff line change @@ -370,6 +370,19 @@ def test_default_reverse_order_on_table_without_primary_key
370
370
end
371
371
end
372
372
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
+
373
386
def test_order_with_hash_and_symbol_generates_the_same_sql
374
387
assert_equal Topic . order ( :id ) . to_sql , Topic . order ( id : :asc ) . to_sql
375
388
end
You can’t perform that action at this time.
0 commit comments