如何用 Arel 语法重写我的 Ruby 方法?

How to re-write my Ruby method with Arel syntax?

我最近升级到 Rails 5.2.X 我现在收到这个弃用警告:

DEPRECATION WARNING: Dangerous query method (method whose arguments are used as raw SQL) called with non-attribute argument(s): "LOWER(projects.name) desc". Non-attribute arguments will be disallowed in Rails 6.0. This method should not be called with user-provided values, such as request parameters or model attributes. Known-safe values can be passed by wrapping them in Arel.sql().

我知道正在讨论此弃用消息here

但我仍然在为正确的语法而苦苦挣扎。

这是我的方法:

def optimized_sort_column
  column_type == :string ? "LOWER(#{unique_sort_column})" : unique_sort_column
end

我尝试将其更改为:

def optimized_sort_column
  column_type == :string ? Arel.sql("lower(#{unique_sort_column})") : unique_sort_column
end

但我仍然收到同样的弃用警告。

我在这里错过了什么?

你能试试这个吗:

.order(
  Arel::Nodes::NamedFunction.new('lower', [unique_sort_column])
)

我认为它发出警告是因为您传递给 Arel 的字符串中的字符串插值(可能不会以这种方式解析)。

我从 scuttle.io 中抓取了它,将默认查询修改为按 lower(author) 排序,并用变量名代替作者进行了本地测试。它不会发出警告。