Rails 6.1中移除has_one关联时触发ActiveRecord::RecordNotSaved错误如何解决
报错原因
Rails 5及以上版本中,belongs_to关联默认开启必填验证,要求关联外键不能为空。你尝试将page的subject_id设为nil时,page实例验证不通过无法保存,因此触发ActiveRecord::RecordNotSaved错误。
另外你提供的Subject表迁移文件存在明显笔误:类名、建表逻辑全部和Page表迁移一致,若实际生产代码也是如此,需要先修正为创建subjects表的正确逻辑。
解决方案
方案1:允许page不关联subject
如果业务逻辑允许page没有对应的subject,修改Page模型的belongs_to声明,添加optional: true参数即可:
class Page < ApplicationRecord # foreign key belongs_to :subject, optional: true end
修改后再执行将外键设为nil的解绑操作即可正常保存。
方案2:保留关联必填限制,调整操作逻辑
如果业务要求page必须绑定subject,不要通过设置外键为nil的方式解绑,根据实际需求选择对应操作:
- 若解绑的同时需要删除关联的page:修改Subject模型的
has_one声明,添加级联删除参数,之后直接删除page即可:class Subject < ApplicationRecord has_one :page, dependent: :destroy # 其余原有代码保持不变 end # 执行删除操作 subject.page.destroy - 若要将page转移给其他subject:直接修改page的关联属性后保存即可:
page.subject = new_subject page.save!
内容的提问来源于stack exchange,提问作者RABEYA KHATUN MUNA
相关产品推荐
相关产品推荐

