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

时间:2014-05-08 13:05:43

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

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

Model.find(id, :readonly => false)

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

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中执行此操作?

1 个答案:

答案 0 :(得分:8)

试试这个:

 Model.readonly(false).find(id)

它没有使用