15

Odwoływanie się do Rails 4.2 add_foreign_key wsparcia:zerowalne klucza obcego w Rails

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

Jak utworzyć zerowalne klucza obcego, aby umożliwić sytuacji, gdzie articles.author_id może być czasami zerowy?

Odpowiedz

6

W przewodniku nie ma nic, co sugerowałoby, że odpowiednie pole obce "NOT NULL" lub wymagane. add_foreign_key po prostu dodaje ograniczenie klucza obcego, czy pole jest wymagane, czy nie (w twoim przypadku author_id w articles).

Czy wystąpił błąd podczas próby migracji podczas migracji?

Oto SQL że będzie generować:

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

Tak więc, jeśli w swojej pierwotnej migracji articles, author_id jest null, wówczas można mieć klucz obcy, który jest pustych.

73

Zauważ, że w Rails 5 może trzeba zaznaczyć odpowiedni stowarzyszenie jako opcja, jeśli jest to 1: N (belongs_to), jako domyślny został zmieniony:

belongs_to :author, optional: true

ta jest odpowiednia Changeset .

Aby użyć starego zachowania całej aplikacji, można także ustawić:

Rails.application.config.active_record.belongs_to_required_by_default = false 

w config/initializers/new_framework_defaults.rb

Błąd można zazwyczaj zobaczyć to:

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

Dodawanie optional: true wraz z belongs_to :author w modelu article wykona zadanie.