加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 与Ruby on Rails中的范围关联

发布时间:2020-12-17 02:57:11 所属栏目:百科 来源:网络整理
导读:我有一个 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

有没有办法让这种关系不只是阅读?

我已经尝试在has_many范围结束时将readonly(false)添加到License,但没有成功.

解决方法

根据 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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读