到目前为止,从数据库中获取随机记录的"common"方法是:
# Postgress
Model.order("RANDOM()").first
# MySQL
Model.order("RAND()").first
但是,在Rails 5.2中执行此操作时,它显示以下弃用警告:
DEPRECATION WARNING: Dangerous query method (method whose arguments are used as raw SQL) called with non-attribute argument(s): "RANDOM()". 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().
我对Arel并不是很熟悉,所以我不确定解决此问题的正确方法是什么。
最佳答案
如果您想继续使用order by random()
,则可以通过弃用警告将其包装在Arel.sql
中来声明其安全性,例如:
Model.order(Arel.sql('random()')).first # PostgreSQL
Model.order(Arel.sql('rand()')).first # MySQL
选择随机行的方法有很多,它们都有优点和缺点,但是有时候您绝对必须在order by
中使用一小段SQL(例如,当您需要the order to match a Ruby array并且必须获得一个大的case when ... end
表达式时)数据库),因此使用Arel.sql
来解决此“仅属性”限制是我们都需要了解的工具。编辑:示例代码缺少右括号。
关于ruby-on-rails - 弃用警告:危险查询方法:ActiveRecord> = 5.2中的随机记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48897070/