Question Ajouter une clé étrangère nullable dans Rails


Référencement aux Rails 4.2 add_foreign_key soutien:

    # 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 permettre la situation, où articles.author_id peut être parfois nul?


23
2017-12-21 12:34


origine


Réponses:


Il n'y a rien dans le guide qui implique add_foreign_key rendrait le champ étranger correspondant "NOT NULL" ou requis. add_foreign_key ajoute simplement une contrainte de clé étrangère, que le champ soit requis ou non (dans votre cas author_id dans articles).

Avez-vous eu 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")

Donc, si dans votre migration initiale de articles, author_id est null, alors vous pouvez avoir une clé étrangère qui est nullable.


5
2017-12-21 15:31



Notez que dans les rails 5 vous devrez peut-être marquer l'association correspondante comme facultative si elle est 1: n (belongs_to), comme la valeur par défaut a été modifiée:

belongs_to :author, optional: true

C'est le correspondant Changeset.

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'

100
2018-06-14 05:40



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


1
2018-01-23 19:39