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



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

弃用警告:危险的查询方法(其参数的方法 用作原始 SQL),使用非属性参数调用: "下(projects.name)描述"。非属性参数将是 在 Rails 6.0 中是不允许的。不应使用 调用此方法 用户提供的值,例如请求参数或模型属性。 已知安全值可以通过将它们包装在 Arel.sql() 中来传递。

我知道这里正在讨论此弃用消息。

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

这是我的方法:

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)排序,并在本地测试,用变量名称代替作者。它不会引发警告。

相关内容

  • 没有找到相关文章

最新更新