Добавить нулевой внешний ключ в Rails

ссылка на 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 иногда может быть null?

3 ответов


в руководстве нет ничего, что подразумевает 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 null, тогда вы можете иметь внешний ключ, который можно аннулировать.


отметим, что в Rails 5 вам может потребоваться отметить соответствующую ассоциацию как необязательную, если она равна 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: 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'

добавлять optional: true вместе с belongs_to :author на article модель сделает работу.