如何*不*获取 ActiveRecord 4 中的只读记录?

Ano*_*noE 5 activerecord ruby-on-rails readonly

我有类似这样的代码:

MyTable.where(something: 'abc').each do |rec|
  rec.some_attr = 123
  rec.save!
end
Run Code Online (Sandbox Code Playgroud)

请注意,我MyTable只是查询和更改,不涉及关系。somethingsome_attr都是普通的 ActiveRecord 属性,没什么花哨的。

MyTable模型相当复杂,具有多种各种关系。

我的问题是recs 设置了标志,所以保存时readonly我得到了。ActiveRecord::ReadOnlyRecord

解决方法是清除只读标志:

rec.instance_variable_set(@readonly, false)
Run Code Online (Sandbox Code Playgroud)

此后,保存工作正常;不过闻起来有鱼腥味。

问题1

据我所知,ActiveRecord 在某些情况下会显式地使返回的记录只读(例如,对于没有明确更新某些内容的 1:n 关系),就像您可以不更新 Oracle 中视图的某些属性一样。那么什么会促使它使查询本身的“基本”记录成为只读呢?我认为这总是可以进行简单的更新。

我能找到的唯一文档是 API readonly?

通过具有捎带属性的联接加载的记录将被标记为只读,因为它们无法保存。

什么是“搭载属性”?

问题2

有没有办法禁用readonly查询本身中的标志?find和其他方法似乎有一个readonly选择(尽管尚不清楚是否readonly: false可以接受,或者是否仅适用于readonly: true使其他可写记录只读的情况)。我尝试过但where没有成功。

来自How to Replace find by readonly on newer Rails? 的解决方案 不起作用:

MyTable.readonly(false).where(something: 'abc').each do |rec|  # seems to be a no-op

MyTable.where(something: 'abc').readonly(false).each do |rec|  # same
Run Code Online (Sandbox Code Playgroud)

提前致谢!