我目前正在完成关于Lynda的Ruby on Rails Essentials 5培训课程,在关于一对一协会的部分,我创建了一个"主题" has_one" Page。"每个模型如下所示:
class Subject < ApplicationRecord
has_one :page
scope :visible, lambda {where(:visible => true)}
scope :invisible, lambda {where(:visible => false)}
scope :sorted, lambda {order("position ASC")}
scope :newest_first, lambda {order("created_at DESC")}
scope :search, lambda {|query| where(["name LIKE ?", "%#{query}%"])}
end
/////
class Page < ApplicationRecord
belongs_to :subject
end
在db中,我有一个通过id找到的现有Subject并保存到变量中。然后我创建一个新的Page对象(但不保存它),最后,我通过subject.page = page来坚持它。问题是,当我尝试使用subject.page = nil删除关联时,我最终得到以下错误:
irb(main):004:0> subject.page = nil
(0.3ms) BEGIN
(0.2ms) ROLLBACK
ActiveRecord::RecordNotSaved: Failed to remove the existing associated
page. The record failed to save after its foreign key was set to nil.
from (irb):4
我认为页面记录的预期行为是将其外键重新分配为NULL。这种行为反映在我使用的教程中,以及有关该主题的其他帖子中。我在这里缺少什么?
答案 0 :(得分:1)
自rails 5以来,belongs_to关联的行为已发生变化。 它检查相关记录是否仍然存在,如果不存在 - 则抛出错误。
如果你想保持页面对象没有关联,你应该添加 belongs_to:subject,可选:true