Activerecord 修复了“”上的弃用警告“危险查询方法”。.order`

Activerecord 修复了“”上的弃用警告“危险查询方法”。.order`,activerecord,ruby-on-rails-5,sql-order-by,arel,ruby-on-rails-6,Activerecord,Ruby On Rails 5,Sql Order By,Arel,Ruby On Rails 6,我有一个定制的gem,它使用来自elasticsearch实例的输入创建AR查询 记录ID:是ES结果的返回ID order:是ES返回的ID的顺序 search\u class.wheresearch\u class.primary\u key=>record\u id.orderorder 现在的实现是将订单字符串直接构建到order变量中,因此看起来像这样:[\positions\.\id\='fcdc924a-21da-440e-8d20-eec9a71321a7'DESC] 这可以正常

我有一个定制的gem,它使用来自elasticsearch实例的输入创建AR查询

记录ID:是ES结果的返回ID order:是ES返回的ID的顺序 search\u class.wheresearch\u class.primary\u key=>record\u id.orderorder 现在的实现是将订单字符串直接构建到order变量中,因此看起来像这样:[\positions\.\id\='fcdc924a-21da-440e-8d20-eec9a71321a7'DESC] 这可以正常工作,但会抛出一个弃用警告,最终在rails6中不会起作用

DEPRECATION WARNING: Dangerous query method (method whose arguments are used as raw SQL) called with non-attribute argument(s): "\"positions\".\"id\" = 'fcdc924a-21da-440e-8d20-eec9a71321a7' 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()
所以我尝试了两种不同的方法,但都没有成功

订单=[\positions\.\id\='fcdc924a-21da-440e-8d20-eec9a71321a7'说明] 无法工作,因为order是数组 .orderArel.sqlorder 没有错误,但只返回ActiveRecord\u关系 on.inspect返回`PG::SyntaxError:ERROR:syntaxer ERROR位于或接近[` .orderArel.sql{order} .to\ u sql:ORDER BY[\\\\positions\\\\\\id\\\='fcdc924a-21da-440e-8d20-eec9a71321a7'DESC\] 订单=['fcdc924a-21da-440e-8d20-eec9a71321a7',…] 不起作用,因为它仅适用于整数值 .orderidxARRAY{order},{search_class.primary_key} 。按idxARRAY[\fcdc924a-21da-440e-8d20-eec9a71321a7\,…]发送sql订单,id 仅返回ActiveRecord\u关系 on.inspect返回`PG::InFailedSqlTransaction:错误:` .orderarray\u positionARRAY{order},{search\u class.primary\u key} .to_sql:ORDER BY array_positionARRAY[\fcdc924a-21da-440e-8d20-eec9a71321a7\,…],id 由于rails将来会强制使用属性参数,而an没有选择退出的选项,所以我有点被卡住了。由于顺序是代码生成的数组,并且我完全控制了值,所以我很好奇如何实现这一点。也许有人之前就遇到过这个问题,请给出一些有用的见解或想法?

您可以尝试应用Arel.sql to数组的元素,即

search_class.where(search_class.primary_key => record_ids)
  .order(order.map {|i| i.is_a?(String) ? Arel.sql(i) : i}) 


这是以前问过的问题。详细信息。@SebastianPalma我知道github的问题已经解决,但没有针对这个特定问题的解决方案。同样,与此相关的SO问题也没有针对这个问题的解决方案。我试图根据可能的解决方案来解决我的特定案例,但这些解决方案与问题中所述的不一样。是否有传递整个订单数组的原因?为什么不传递订单[0]?因为数组定义了db的die结果的排序顺序。AR.whereid:一些_ID不能保证顺序,我想应用弹性结果的顺序。在本例中,我只使用了数组中的一个条目,但它们也可以是多个。问题是将数组传递给活动记录顺序方法。