我的项目中有这段遗留代码:
Model.find(id, :readonly => false)
显然,它通过id搜索,并且只有那些不是只读的对象。但是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中检查只读属性,因为它不是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位至关重要,但我无法用简单的where来替换它。在新版本的rails中,我该怎么做?
readonly(false)
,并调用readonly?
;它应该返回 false(除非我漏掉了什么)。如果是这种情况,你就不需要readonly(false)
。 - Paul Richter