在Rails中添加可空的外键

61

参考 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有时为空的情况?

3个回答

198

请注意,在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


20

article 模型中添加 belongs_to :authoroptional: true 将完成该任务。


1
这仅适用于mongoid...我遇到了相同的问题,但是使用pg。不幸的是,它不起作用。 - Boenne
2
上述代码是我在运行PG上的应用程序中直接提取的。在使用Postgres时,我从未遇到过这样的问题。 - Rajan Verma - Aarvy
1
确认@RajanVerma-Aarvy是正确的;这对我在Postgres db上工作。 - johnpitchko

10

这份指南中没有任何内容表明 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")

如果在您最初的迁移中,articlesauthor_id 为 null,则可以拥有可空的外键。


1
我相信这对于Rails 4及以下版本是准确的,是吗? - karns
@karns 确切地。 - maicher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接