Добавить нулевой внешний ключ в 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
будет выполнять эту работу.