如何重新写我的Ruby法阿雷尔语法?

时间:2019-02-02 12:30:01

标签: ruby-on-rails ruby activerecord arel

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

  

DEPRECATION警告:危险的查询方法(其参数的方法   用作原始SQL),并使用非属性参数调用:   “ LOWER(projects.name)desc”。非属性参数将是   在Rails 6.0中不允许使用。这种方法不应该被称为   用户提供的值,例如请求参数或模型的属性。   可以通过将已知安全值包装在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

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

我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

您能尝试一下吗?

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

我认为这是引发警告的原因,因为您传递给Arel的字符串中的字符串插值(可能不是这样解析的。)

我从scuttle.io那里抢了下来,将默认查询修改为lower(author)进行排序,并在本地进行了测试,用变量名代替了author。它不会发出警告。