如何在更新的Rails上通过readonly替换find?

Lua*_*ico 3 ruby activerecord ruby-on-rails deprecation-warning

我的项目中有这个遗留代码:

Model.find(id, :readonly => false)
Run Code Online (Sandbox Code Playgroud)

显然,它通过id搜索,只搜索不是readonly的对象.但readonly不是Model的属性,这应该是检查实际的ActiveRecord属性,该属性定义该实例是否是只读实例.我不知道这个代码实际上是做什么的,也许是:readonly => false在那里没用.但是我得到了预期的警告:

DEPRECATION WARNING: Passing options to #find is deprecated. Please build a scope and then call #find on it.
Run Code Online (Sandbox Code Playgroud)

我无法用where替换它,因为我无法在SQL中检查readonlyness,因为它不是SQL属性.

该错误实际上明确指出我仍然可以使用find,如果在范围内.但我做了一个范围,如下:

scope :by_id_not_readonly, ->(id) { find(id, :readonly => false) }
Run Code Online (Sandbox Code Playgroud)

但抛出相同的警告,但在模型中的范围声明行而不是控制器...


我做了一些其他测试:

用where替换它('id =?AND readonly = false',id)实际上给出了一个错误,因为例外 - readonly不适合模型.

在没有readonly位的情况下运行代码会破坏测试,因为它返回只读记录,稍后代码会尝试更新它们,从而产生错误.

向查找散列添加不正确的选项,例如find(id,:readonly => false,:ldisfs32j9fmdf90sdfds => false)会产生未知密钥错误,例外情况.


所以,这:readonly位是至关重要的,但我无法用简单的地方替换它.如何在较新版本的rails中执行此操作?

zis*_*she 8

试试这个:

 Model.readonly(false).find(id)
Run Code Online (Sandbox Code Playgroud)

它不是在哪里使用

  • 阅读更多关于readonly的信息 - http://apidock.com/rails/ActiveRecord/Base/readonly%3F (3认同)
  • @LuanNico作为一个实验,尝试删除`readonly(false)`,并调用`readonly?`; 它应该是假的(除非有我遗漏的东西).就是这样,你不需要`readonly(false)`. (2认同)