我的项目中有这个遗留代码:
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) }
但是抛出了相同的警告,但是在模型的范围声明行而不是 Controller 中......
我做了一些其他的测试:
用 where('id = ? AND readonly = false', id) 替换它实际上会产生错误,除非 - readonly 不是模型的正确内容。
在没有 readonly 位的情况下运行代码会破坏测试,因为它返回只读记录,并且代码稍后尝试更新它们,并给出错误。
向查找哈希添加不正确的选项,例如find(id, :readonly => false, :ldisfs32j9fmdf90sdfds => false) 给出了一个未知的键错误,作为异常(exception)。
所以,这个 :readonly 位是至关重要的,但我不能用一个简单的 where 来代替它。我怎样才能在较新版本的 rails 中做到这一点?
最佳答案
试试这个:
Model.readonly(false).find(id)
它没有使用 where
关于ruby-on-rails - 如何在较新的 Rails 上通过 readonly 替换 find?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23542623/