Référence à Rails 4.2 add_foreign_key support:
# add a foreign key to `articles.author_id` referencing `authors.id`
add_foreign_key :articles, :authors
Comment créer une contrainte de clé étrangère nullable, pour autoriser la situation, où articles.author_id
peut être parfois nul?
Il n'y a rien dans le guide qui implique add_foreign_key
rendrait le champ étranger correspondant "NON NUL" ou obligatoire. add_foreign_key
ajoute simplement une contrainte de clé étrangère, que le champ soit obligatoire ou non (dans votre cas author_id
dans articles
).
Avez-vous rencontré une erreur lors de votre tentative de migration?
Voici le SQL qu'il générerait:
ALTER TABLE "articles" ADD CONSTRAINT articles_author_id_fk FOREIGN KEY ("author_id") REFERENCES "authors" ("id")
SO, si dans votre migration d'origine de articles
, author_id
est nul, alors vous pouvez avoir une clé étrangère qui peut être annulée.
Notez que dans Rails 5 , vous devrez peut-être marquer l'association correspondante comme facultative si elle est 1: n (belongs_to
), la valeur par défaut ayant été modifiée:
belongs_to :author, optional: true
Il s'agit du Changeset correspondant.
Pour utiliser l'ancien comportement dans votre application, vous pouvez également définir:
Rails.application.config.active_record.belongs_to_required_by_default = false
dans config/initializers/new_framework_defaults.rb
L'erreur que vous verrez généralement est:
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'
Ajouter optional: true
de même que belongs_to :author
dans article
le modèle fera le travail.