web-dev-qa-db-ja.com

RailsにNULL入力可能外部キーを追加

Rails 4.2 add_foreign_key サポートの参照:

    # add a foreign key to `articles.author_id` referencing `authors.id`
    add_foreign_key :articles, :authors

状況を許容するために、null許容の外部キー制約を作成する方法、articles.author_idはnullになることもありますか?

40
maicher

ガイドには、add_foreign_keyが対応する外部フィールドを「NOT NULL」または必須にすることを意味するものはありません。 add_foreign_keyは、フィールドが必須であるかどうかにかかわらず、外部キー制約を追加します(あなたの場合、articlesauthor_id)。

移行でこれを試したときにエラーが発生しましたか?

生成されるSQLは次のとおりです。

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

したがって、元のarticlesの移行でauthor_idがnullの場合、nullを許可する外部キーを持つことができます。

9
user1322092

in 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'
135
MattW.

articleモデルにoptional: trueとともにbelongs_to :authorを追加すると、仕事ができます。

4
Rajan Verma