diff options
author | Eugene Kenny <elkenny@gmail.com> | 2017-02-26 23:29:08 +0000 |
---|---|---|
committer | Eugene Kenny <elkenny@gmail.com> | 2017-02-27 00:39:12 +0000 |
commit | 6cf4835b743cbce2536d53ae0a4a998f4f0f1e24 (patch) | |
tree | 06ca2aa01fae176323fb1cc6e0a94b8bf7c9b069 /activerecord/lib/active_record | |
parent | 25c3227255dee0e937e69f58f0cffbf9318948bd (diff) | |
download | rails-6cf4835b743cbce2536d53ae0a4a998f4f0f1e24.tar.gz rails-6cf4835b743cbce2536d53ae0a4a998f4f0f1e24.tar.bz2 rails-6cf4835b743cbce2536d53ae0a4a998f4f0f1e24.zip |
Allow order to be given expressions as hash keys
When `order` is given a hash, the keys are currently assumed to be
attribute names and are quoted as such in the query, which makes it
impossible to pass an expression instead:
Post.order("LENGTH(title)" => :asc).last
# SELECT `posts`.* FROM `posts` ORDER BY `posts`.`LENGTH(title)` DESC LIMIT 1
If the key is an `Arel::Nodes::SqlLiteral`, we now use it directly in
the query. This provides a way to build a relation with a complex order
clause that can still be reversed with `reverse_order` or `last`.
Diffstat (limited to 'activerecord/lib/active_record')
-rw-r--r-- | activerecord/lib/active_record/relation/query_methods.rb | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/relation/query_methods.rb b/activerecord/lib/active_record/relation/query_methods.rb index 4ee413c805..1178dec706 100644 --- a/activerecord/lib/active_record/relation/query_methods.rb +++ b/activerecord/lib/active_record/relation/query_methods.rb @@ -1130,7 +1130,12 @@ module ActiveRecord arel_attribute(arg).asc when Hash arg.map { |field, dir| - arel_attribute(field).send(dir.downcase) + case field + when Arel::Nodes::SqlLiteral + field.send(dir.downcase) + else + arel_attribute(field).send(dir.downcase) + end } else arg |