如何用 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)
排序,并用变量名代替作者进行了本地测试。它不会发出警告。
我最近升级到 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)
排序,并用变量名代替作者进行了本地测试。它不会发出警告。