56

参考 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可以有时为空?

4

3 回答 3

188

请注意,在 Rails 5Rails 6中,如果它是 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: 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

于 2016-06-14T05:40:20.343 回答
16

optional: true与模型一起belongs_to :author添加将article完成这项工作。

于 2018-01-23T19:39:03.087 回答
10

指南中没有任何内容暗示add_foreign_key会使相应的外部字段“NOT NULL”或必需。add_foreign_key只需添加一个外键约束,无论该​​字段是否必需(在您的情况下author_idarticles

您在迁移中尝试此操作时是否遇到错误?

这是它将生成的 SQL:

ALTER TABLE "articles" ADD CONSTRAINT articles_author_id_fk FOREIGN KEY ("author_id") REFERENCES "authors" ("id")

因此,如果在您的原始迁移中articles,author_id为空,那么您可以拥有可为空的外键。

于 2014-12-21T15:31:36.137 回答