引用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
有时可能为空的情况?
答案 0 :(得分:128)
请注意,在Rails 5中 ,如果默认值已更改,则可能需要将相应的关联标记为可选,如果它是1:n(belongs_to
):
belongs_to :author, optional: true
这是相应的Changeset。
要在整个应用程序中使用旧行为,您还可以设置:
Rails.application.config.active_record.belongs_to_required_by_default = false
config/initializers/new_framework_defaults.rb
中的
您通常会看到的错误是:
ActiveRecord::RecordInvalid: Validation failed: Author 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'
答案 1 :(得分:7)
指南中没有任何内容暗示add_foreign_key
会使相应的外部字段“NOT NULL”或必需。 add_foreign_key
只是添加一个外键约束,无论该字段是否必需(在author_id
中为articles
})。
您在迁移中尝试此操作时是否收到错误消息?
这是它将生成的SQL:
ALTER TABLE "articles" ADD CONSTRAINT articles_author_id_fk FOREIGN KEY ("author_id") REFERENCES "authors" ("id")
因此,如果在articles
的原始迁移中,author_id
为空,那么您可以使用可以为空的外键。
答案 2 :(得分:6)
Adding optional: true
along with belongs_to :author
in article
model will do the job.