如何在新版Rails中用readonly替换find?

4

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

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中,我该怎么做?
1个回答

8

试试这个:

 Model.readonly(false).find(id)

它没有使用where条件


3
了解更多关于readonly的内容,请访问http://apidock.com/rails/ActiveRecord/Base/readonly%3F - sameera207
2
作为一个实验,也尝试移除 readonly(false),并调用 readonly?;它应该返回 false(除非我漏掉了什么)。如果是这种情况,你就不需要 readonly(false) - Paul Richter
Model.readonly(false).find(id).readonly? 对我来说返回了 true。这个有变化吗? - stytown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接