mirror of https://github.com/rails/rails
Fix `QueryMethods#in_order_of` to handle empty order list
Fix: https://github.com/rails/rails/issues/43903 Ref: https://github.com/rails/rails/pull/42061 Simply don't generate the case statement if the order list is empty and fallback to default ordering.
This commit is contained in:
parent
b376da83b3
commit
fb77d4a39d
|
@ -1,3 +1,14 @@
|
|||
* Fix `QueryMethods#in_order_of` to handle empty order list.
|
||||
|
||||
```ruby
|
||||
Post.in_order_of(:id, []).to_a
|
||||
```
|
||||
|
||||
Also more explicitly set the column as secondary order, so that any other
|
||||
value is still ordered.
|
||||
|
||||
*Jean Boussier*
|
||||
|
||||
* Fix quoting of column aliases generated by calculation methods.
|
||||
|
||||
Since the alias is derived from the table name, we can't assume the result
|
||||
|
|
|
@ -432,10 +432,14 @@ module ActiveRecord
|
|||
references = column_references([column])
|
||||
self.references_values |= references unless references.empty?
|
||||
|
||||
values = values.map { |value| type_caster.type_cast_for_database(column, value) }
|
||||
column = order_column(column.to_s) if column.is_a?(Symbol)
|
||||
if values.empty?
|
||||
spawn.order!(column)
|
||||
else
|
||||
values = values.map { |value| type_caster.type_cast_for_database(column, value) }
|
||||
|
||||
spawn.order!(connection.field_ordered_value(column, values))
|
||||
arel_column = column.is_a?(Symbol) ? order_column(column.to_s) : column
|
||||
spawn.order!(connection.field_ordered_value(arel_column, values), column)
|
||||
end
|
||||
end
|
||||
|
||||
# Replaces any existing order defined on the relation with the specified order.
|
||||
|
|
|
@ -14,6 +14,18 @@ class FieldOrderedValuesTest < ActiveRecord::TestCase
|
|||
assert_equal(order, posts.map(&:id))
|
||||
end
|
||||
|
||||
def test_unspecified_order
|
||||
order = [3, 4, 1]
|
||||
post_ids = Post.in_order_of(:id, order).map(&:id)
|
||||
expected_order = order + (post_ids - order).sort
|
||||
assert_equal(expected_order, post_ids)
|
||||
end
|
||||
|
||||
def test_in_order_of_empty
|
||||
posts = Post.in_order_of(:id, [])
|
||||
assert_equal(posts.map(&:id).sort, posts.map(&:id))
|
||||
end
|
||||
|
||||
def test_in_order_of_with_enums_values
|
||||
Book.destroy_all
|
||||
Book.create!(status: :proposed)
|
||||
|
|
Loading…
Reference in New Issue