15

Riferimento a Rails 4.2 add_foreign_key supporto:Aggiungere annullabile chiave esterna in Rails

# add a foreign key to `articles.author_id` referencing `authors.id` 
    add_foreign_key :articles, :authors 

Come creare un annullabile vincolo di chiave esterna, per consentire la situazione, in cui articles.author_id può essere a volte nullo?

risposta

6

Non c'è nulla nella guida che implichi add_foreign_key renderebbe il campo esterno corrispondente "NOT NULL" o richiesto. add_foreign_key aggiunge semplicemente un vincolo di chiave esterna indipendentemente dal fatto che il campo sia richiesto o meno (nel tuo caso author_id in articles).

Si è verificato un errore durante il tentativo di migrazione?

Ecco lo SQL che genererebbe:

ALTER TABLE "articles" ADD CONSTRAINT articles_author_id_fk FOREIGN KEY ("author_id") REFERENCES "authors" ("id") 

così, se nella migrazione originale di articles, author_id è nullo, allora si può avere chiave esterna che è annullabile.

73

noti che in Rails 5 potrebbe essere necessario marcare la corrispondente associazione come optional se si tratta di 1: n (belongs_to), come impostazione predefinita è stata modificata:

belongs_to :author, optional: true

Questo è il corrispondente Changeset .

Per utilizzare il vecchio comportamento in tutta l'applicazione, è possibile anche impostare:

Rails.application.config.active_record.belongs_to_required_by_default = false 

in config/initializers/new_framework_defaults.rb

L'errore di solito si vede è:

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' 
-1

Aggiunta optional: true insieme belongs_to :author nel modello article farà il lavoro.