Antwort

6

Es gibt nichts in der Anleitung, die impliziert add_foreign_key würde das entsprechende ausländische Feld "NOT NULL" oder erforderlich machen. add_foreign_key fügt einfach eine Fremdschlüssel-Einschränkung hinzu, ob das Feld erforderlich ist oder nicht (in Ihrem Fall author_id in articles).

Haben Sie bei der Migration einen Fehler erhalten?

Hier ist die SQL, die es erzeugen würde:

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

SO, wenn in der ursprünglichen Migration von articles, author_id null ist, dann können Sie Fremdschlüssel haben, die NULL-Werte zulassen ist.

73

Beachten Sie, dass in Rails 5 Sie können die entsprechende Zuordnung als optional markieren müssen, wenn es 1 ist: n (belongs_to), als Standard geändert wurde:

belongs_to :author, optional: true

Dies wird die entsprechende Changeset .

Um das alte Verhalten in Ihrer Anwendung zu verwenden, können Sie auch festlegen:

Rails.application.config.active_record.belongs_to_required_by_default = false 

in config/initializers/new_framework_defaults.rb

Der Fehler, den Sie in der Regel sehen ist:

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

Hinzufügen optional: true zusammen mit belongs_to :author in article Modell wird die Aufgabe erledigen.