3

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

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

显然,它按 id 搜索,并且只搜索非只读的对象。但是 readonly 不是模型的属性,这应该检查定义该实例是否为只读实例的实际 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 不是模型的正确选择。

运行没有只读位的代码会破坏测试,因为它返回只读记录,并且代码稍后会尝试更新它们,从而给出错误。

向查找哈希添加不正确的选项,例如 find(id, :readonly => false, :ldisfs32j9fmdf90sdfds => false) 会产生未知密钥错误,但除外。


所以,这个 :readonly 位是至关重要的,但我不能用简单的 where 替换它。如何在较新版本的 rails 中做到这一点?

4

1 回答 1

8

试试这个:

 Model.readonly(false).find(id)

它没有在哪里使用

于 2014-05-08T13:25:25.017 回答