Ich spiele mit Elixir und dem Phoenix-Web-Framework, aber jetzt muss ich versuchen, eine Fremdschlüssel-Einschränkung zu validieren. Bei einem Modell Post
mit vielen Kommentaren schrieb ich das Comment
-Modell wie folgt:
und sein Komponententest:
%Vor%Nach Ссылка :
Die Fremdschlüsseleinschränkung funktioniert, indem sie sich auf die zu überprüfende Datenbank verlässt ob das zugehörige Modell existiert oder nicht. Dies ist nützlich um zu garantieren dass ein Kind nur erstellt wird, wenn der Elternteil in der Datenbank vorhanden ist auch.
Ich habe erwartet, dass der Code, den ich geschrieben habe, funktioniert hat, stattdessen wird nur nach Anwesenheit gesucht (wie in @required_fields ~w(body post_id)
definiert). Ich schließe nicht aus, ich habe etwas falsch gemacht oder die Aussage in den Dokumenten missverstanden.
Ist schon jemand darauf gestoßen?
UPDATE: Der Vollständigkeit halber ist hier die Migration:
%Vor% Da es auf der Datenbank beruht, müssen Sie die Referenzen in der Migration hinzufügen und die eigentliche Datenbankoperation ausführen. Sie müssen Repo.insert/1
oder Repo.update/1
aufrufen, um Ihren Änderungssatz zu geben, und dann wird {:error, changeset}
zurückgegeben.
Denk daran, es gibt keine Objekte in Elixir oder Ecto. Daher kann changeset.valid?
niemals eine Datenbankoperation ausführen, sondern nur Daten, die eine Reihe von Änderungen widerspiegeln, die ausgeführt werden, und der Status dieser Daten wird bei der Ausführung von Operationen wie Einfügen oder Aktualisieren transformiert.
Eine letzte Anmerkung, errors_on/2
gibt immer einen neuen Änderungssatz zurück und nicht den, mit dem Sie bis jetzt gearbeitet haben. Ihre letzte Zeile sollte wahrscheinlich sein:
"Verlass auf die Datenbank" bedeutet, dass Sie in Ihrem Datenbankmodell eine FREMDE KEY CONSTRAINT haben müssen.
Bei Ihrer Migration sollten Sie so etwas haben:
%Vor%Erzwingt eine FOREIGN KEY CONSTRAINT CHECK zwischen der übergeordneten und der untergeordneten Tabelle.
Tags und Links elixir phoenix-framework ecto