如何在更新的Rails上通过readonly替换find?
我的项目中有这个遗留代码:
Model.find(id, :readonly => false)
显然,它通过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.
我无法用where替换它,因为我无法在SQL中检查readonlyness,因为它不是SQL属性。
该错误实际上明确指出,如果在范围内,我仍然可以使用find。 但我做了一个范围,如下:
scope :by_id_not_readonly, ->(id) { find(id, :readonly => false) }
但抛出相同的警告,但在模型中的范围声明行而不是控制器…
我做了一些其他测试:
将其替换为where(’id =?AND readonly = false’,id)实际上会产生错误,因为例外 – readonly不适合模型。
在没有readonly位的情况下运行代码会破坏测试,因为它返回只读记录,稍后代码会尝试更新它们,从而产生错误。
向查找散列添加不正确的选项,例如find(id,:readonly => false,:ldisfs32j9fmdf90sdfds => false)会产生未知密钥错误,例外情况。
所以,这个:readonly位是至关重要的,但我无法用简单的地方替换它。 如何在较新版本的rails中执行此操作?
试试这个:
Model.readonly(false).find(id)
它不是在哪里使用