参考 Rails 4.2 add_foreign_key 支持:
# add a foreign key to `articles.author_id` referencing `authors.id`
add_foreign_key :articles, :authors
如何创建可为空的外键约束,以允许articles.author_id
有时为空的情况?
参考 Rails 4.2 add_foreign_key 支持:
# add a foreign key to `articles.author_id` referencing `authors.id`
add_foreign_key :articles, :authors
如何创建可为空的外键约束,以允许articles.author_id
有时为空的情况?
请注意,在Rails 5和Rails 6中,如果你使用1:n(belongs_to
)关联,你可能需要将相应的关联标记为可选的,因为默认值已更改:
belongs_to :author, optional: true
这是相应的更改集。
要在整个应用程序中使用旧行为,你也可以设置:
Rails.application.config.active_record.belongs_to_required_by_default = false
在config/initializers/new_framework_defaults.rb
文件中。
你通常会看到的错误是:
ActiveRecord::RecordInvalid: Validation failed: Class must exist
from /usr/local/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/validations.rb:78:in `raise_validation_error'
如果已经运行迁移,您还需要更新任何迁移:将null:false
更改为true
并运行rake db:redo
。
在 article
模型中添加 belongs_to :author
和 optional: true
将完成该任务。
这份指南中没有任何内容表明 add_foreign_key
会让对应的外键字段变为“NOT NULL”或者必须的。 add_foreign_key
只是添加一个外键约束,无论该字段是否必须(在你的情况下是在 articles
表中的 author_id
字段)。
你在迁移时尝试过这个方法,但出现了错误吗?
这里是它将生成的 SQL:
ALTER TABLE "articles" ADD CONSTRAINT articles_author_id_fk FOREIGN KEY ("author_id") REFERENCES "authors" ("id")
如果在您最初的迁移中,articles
的author_id
为 null,则可以拥有可空的外键。