ruby-on-rails - 如何在较新的 Rails 上用只读替换查找?

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

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

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

显然,它按 id 搜索并且只搜索非只读的对象。但是只读不是模型的属性,这应该检查定义该实例是否为只读实例的实际 ActiveRecord 属性。我不知道这段代码是否真的这样做了,也许 :readonly => false 在那里没用。但我收到了预期的警告:

DEPRECATION WARNING: Passing options to #find is deprecated. Please build a scope and then call #find on it.

而且我无法用 where 替换它,因为我无法检查 SQL 中的只读性,因为它不是 SQL 属性。

错误实际上明确指出,如果在范围内,我仍然可以使用查找。但我做了一个范围,就像这样:

scope :by_id_not_readonly, ->(id) { find(id, :readonly => false) }

但是同样的警告被抛出,但是在模型而不是 Controller 的范围声明行中......


我做了一些其他的测试:

用 where('id = ? AND readonly = false', id) 替换它实际上会给出一个错误,异常(exception)情况 - readonly 不是模型的正确方法。

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

向查找散列添加不正确的选项,例如find(id, :readonly => false, :ldisfs32j9fmdf90sdfds => false) 给出了一个未知的 key 错误,作为异常(exception)。


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

最佳答案

试试这个:

 Model.readonly(false).find(id)

它没有在什么地方使用

关于ruby-on-rails - 如何在较新的 Rails 上用只读替换查找?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23542623/

相关文章:

ruby-on-rails - 使用选项配置 block 进行序列化

ruby-on-rails - rvm --default 不设置 1.9.2 ubuntu 11.10 + 无法安装 rails

ruby - 无法在 OS X Mavericks Xcode 5.1 上安装 CocoaPods

mysql - Rails 3 事件记录 : Order by count on association

ruby-on-rails - 如何让 Rails 以正确的数据类型而不是字符串返回 SUM(columnName) 属性?

ruby-on-rails - 如何在 ActiveRecord 中使用默认的 sql 表达式?

ruby-on-rails - 当我进行捆绑安装时,我收到了 kgio gem 的 gem 安装错误

ruby - 在 Ruby 中将字符串与列表近似匹配并返回值的最简洁方法?

java - JRuby GUI 窗口

ruby-on-rails - 如何将 Rails #update_attribute 与数组字段一起使用?