在Rails中添加可以为空的外键

mai*_*her 41 ruby ruby-on-rails ruby-on-rails-4 rails-activerecord ruby-on-rails-4.2

引用Rails 4.2 add_foreign_key支持:

    # add a foreign key to `articles.author_id` referencing `authors.id`
    add_foreign_key :articles, :authors
Run Code Online (Sandbox Code Playgroud)

如何创建一个可以为空的外键约束,允许这种情况,哪里articles.author_id可以有时为null?

Mat*_*tW. 143

请注意,在Rails 5中,您可能需要将相应的关联标记为可选,如果它是1:n(belongs_to),则默认值已更改:

belongs_to :author, optional: true

这是相应的Changeset.

要在整个应用程序中使用旧行为,您还可以设置:

Rails.application.config.active_record.belongs_to_required_by_default = false
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)


use*_*092 10

指南中没有任何内容暗示add_foreign_key会使相应的外部字段"非空"或需要.add_foreign_key只是添加字段是否需要与否(在你的情况下,外键约束author_idarticles).

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

这是它将生成的SQL:

ALTER TABLE "articles" ADD CONSTRAINT articles_author_id_fk FOREIGN KEY ("author_id") REFERENCES "authors" ("id")
Run Code Online (Sandbox Code Playgroud)

因此,如果在您的原始迁移中articles,author_id为null,那么您可以使用可以为空的外键.


Aar*_*rvy 5

添加optional: true沿belongs_to :authorarticle模式将做的工作。

  • 上面的行直接取自我在 PG 上运行的应用程序。我在使用 Postgres 时没有遇到过这样的问题。 (2认同)