web-dev-qa-db-fra.com

Ajouter une clé étrangère nullable dans Rails

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?

40
maicher

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.

9
user1322092

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'
135
MattW.

Ajouter optional: true de même que belongs_to :author dans article le modèle fera le travail.

4
Rajan Verma