与Ruby on Rails中的范围相关联
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了与Ruby on Rails中的范围相关联相关的知识,希望对你有一定的参考价值。
我有一个Ruby on Rails应用程序,其中我有许可证,可以获得许可的项目以及列出这两个项目的表格(许可证中存在哪些数量的项目?)。类似于购物车中的物品。
有些项目将不再销售,但我打算将它们保存在数据库中。然后,我创建了一个软删除,并使用了模板和关系的默认范围。但是当我尝试使用相关模板更改现有记录时,我得到一个例外:ActiveRecord :: ReadOnlyRecord
我的模板看起来像这样:
class Item <ActiveRecord :: Base
default_scope {where (deleted: false)}
end
class LicenseItem <ActiveRecord :: Base
belongs_to: license, touch: true
belongs_to: item
end
class License <ActiveRecord :: Base
has_many: license_items,
-> {joins (: item) .where (items: {deleted: false})},
dependent:: destroy
end
通过这种方式:
pry (main)> License.find (0) .license_items [0] .readonly?
=> true
有没有办法让这种关系不只是阅读?
我已经尝试在readonly (false)
范围结束时添加has_many
toLicense
但没有成功。
答案
根据this thread in GitHub,这是一个Rails 4.0错误,已在4.0.1版本中修复。更新您的Rails,您可以在您的范围中包含readonly (false)
,它将起作用:
class License <ActiveRecord :: Base
has_many: license_items,
-> {joins (: item) .where (items: {deleted: false}). readonly (false)},
dependent:: destroy
end
要更新Rails版本,请编辑Gemfile
然后运行bundle update
。
在后一种情况下,如果您无法更新Rails版本,则可以将readonly: false
选项传递给find
(不推荐)方法:
License.find (1) .license_items.find (1, readonly: false) .update_attributes (amount: 5)
以上是关于与Ruby on Rails中的范围相关联的主要内容,如果未能解决你的问题,请参考以下文章
Ruby on Rails - ActiveRecord 关联问题:查询未正确进行(单数与复数?)