Добавить нулевой внешний ключ в 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'