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只是查询和更改,不涉及关系。something和some_attr都是普通的 ActiveRecord 属性,没什么花哨的。
该MyTable模型相当复杂,具有多种各种关系。
我的问题是recs 设置了标志,所以保存时readonly我得到了。ActiveRecord::ReadOnlyRecord
解决方法是清除只读标志:
rec.instance_variable_set(@readonly, false)
Run Code Online (Sandbox Code Playgroud)
此后,保存工作正常;不过闻起来有鱼腥味。
据我所知,ActiveRecord 在某些情况下会显式地使返回的记录只读(例如,对于没有明确更新某些内容的 1:n 关系),就像您可以不更新 Oracle 中视图的某些属性一样。那么什么会促使它使查询本身的“基本”记录成为只读呢?我认为这总是可以进行简单的更新。
我能找到的唯一文档是 API readonly?:
通过具有捎带属性的联接加载的记录将被标记为只读,因为它们无法保存。
什么是“搭载属性”?
有没有办法禁用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)
提前致谢!
| 归档时间: |
|
| 查看次数: |
808 次 |
| 最近记录: |