15

Обращение к Rails 4.2 add_foreign_key поддержка:Добавить обнуляемого внешнего ключа в Rails

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

Как создать обнуляемого ограничение внешнего ключа, чтобы разрешить ситуацию, где articles.author_id иногда может быть нулевым?

ответ

6

В руководстве нет ничего, что подразумевает, что 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") 

SO, если в вашей первоначальной миграции articles, author_id имеет нулевое значение, то вы можете иметь внешний ключ, что это обнуляемое.

73

Обратите внимание, что в Rails 5 вам может понадобиться, чтобы отметить соответствующее объединение в качестве дополнительного, если он равен 1: п (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' 
-1

Добавление optional: true вместе с belongs_to :author в article модель выполнит эту работу.