Добавить нулевой внешний ключ в 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 иногда может быть нулевым?

Ответы

Ответ 1

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

Ответ 2

Обратите внимание, что в 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'

Ответ 3

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