与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 关联问题:查询未正确进行(单数与复数?)

Ruby on Rails 中的表关联

ruby on rails 固定装置中的自动关联

ruby on rails 中的关联

如何正确销毁 ruby​​ on rails 中的关联记录?

为啥 Ruby on Rails 不使用 .includes() 加载我的关联对象?