Ste*_*Pon 2 ruby ruby-on-rails
我目前正在学习 Lynda 上的 Ruby on Rails Essentials 5 培训课程,在一对一关联部分中,我创建了一个“主题”,其中包含一个“页面”。每个模型如下所示:
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
Run Code Online (Sandbox Code Playgroud)
/////
class Page < ApplicationRecord
belongs_to :subject
end
Run Code Online (Sandbox Code Playgroud)
在数据库中,我有一个现有的主题,我通过 id 找到并保存到一个变量中。然后我创建了一个新的 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
Run Code Online (Sandbox Code Playgroud)
我相信预期的行为是页面记录将其外键重新分配为 NULL。这种行为反映在我正在使用的教程以及有关该主题的其他帖子中。我在这里缺少什么?
小智 5
从 rails 5 开始,belongs_to 关联的行为发生了变化。它检查关联的记录是否存在,如果不存在,则抛出错误。
如果你想保持没有关联的页面对象,你应该添加belongs_to :subject, optional: true