Activerecord 修复了“”上的弃用警告“危险查询方法”。.order`
我有一个定制的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中不会起作用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] 这可以正常
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不能保证顺序,我想应用弹性结果的顺序。在本例中,我只使用了数组中的一个条目,但它们也可以是多个。问题是将数组传递给活动记录顺序方法。