创建对象时foreign_key是否必填?Rails关联模型创建Book时author_id是否必填?
Rails外键字段必填性问题解析
1. 创建对象时,foreign_key(外键)字段是否为必填项?
这得分情况来看:
- 要是只在模型里定义了关联,但既没给外键字段加数据库层面的非空约束,也没在模型里写
validates :foreign_key, presence: true这类验证规则,那创建对象时外键不是必填的; - 但如果数据库里给外键设了
NOT NULL,或者模型里加了存在性验证,那创建时就必须填,不然肯定会报错。
2. 你的Author & Book模型问题解答
先看你贴的模型代码:
class Author < ApplicationRecord has_many :books end class Book < ApplicationRecord belongs_to :author end
在Rails 5及之后的版本里,belongs_to关联默认会自动加上存在性验证——意思就是要求关联的Author对象必须存在,所以你直接创建Book却不指定author_id的话,就会触发验证,弹出你看到的“作者必须存在”报错。
那能不能不指定author_id创建Book?当然可以!只要改一下belongs_to的配置,把默认的验证关掉就行:
class Book < ApplicationRecord belongs_to :author, optional: true end
不过有两点要提醒你:
- 如果你数据库里的
author_id字段设置了NOT NULL约束,那就算模型里关了验证,数据库层面还是会拦着不让保存,这时候得修改对应的数据库迁移文件,把非空约束去掉; - 关掉验证后,
book.author可能会返回nil,后续写业务逻辑的时候得记得处理这种空值情况,不然容易触发NoMethodError。
内容的提问来源于stack exchange,提问作者evans
相关产品推荐
相关产品推荐

