ruby-on-rails - 弃用警告:危险查询方法:ActiveRecord> = 5.2中的随机记录

标签 ruby-on-rails rails-activerecord deprecation-warning ruby-on-rails-5.2

到目前为止,从数据库中获取随机记录的"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/

相关文章:

ruby - 有没有办法让 2.4.0 中的 Ruby 弃用警告静音?

mysql - 在 MySQL 9.0 的存储过程/例程中定义用户变量

ruby-on-rails - Rails 将并发永久链接回退路由到另一个 Controller

ruby-on-rails - 帮助在 Rails 中构建模型

activerecord - Active Record 加入最近的关联对象属性

ios - 在 Xcode 中显示所有弃用的警告

ruby-on-rails - Rails 不会加载 Assets 管道

ruby-on-rails - 如何构建静态图像的链接?

ruby-on-rails - 如何在 Rails 模型中创建多个类和实例方法