cast_assoc
auf „Cast zugeordnet Modell“ verwendet und kann nur mit has_one
und has_many
verwendet werden. belongs_to
relation definiert die ausländische ID in dem Modell, in dem sie aufgerufen wird. has_many
und has_one
verlassen sich auf "das andere" Objekt mit Fremdschlüssel.
Wenn Sie Objekte erstellen, die viele andere Objekte haben, ist es sinnvoll, alle zu überprüfen, ob sie gültig sind. cast_assoc
ruft cast
in ihren jeweiligen Modulen auf.
Ihr Benutzer kann viele Abonnements haben (wahrscheinlich, rate ich hier), so ist es nicht sinnvoll, Benutzer beim Erstellen des Abonnements zu erstellen und zu überprüfen, ob der Benutzer über cast_assoc
gültig ist. In diesem Fall existiert der Benutzer normalerweise bereits in der Datenbank.
In Ihrem Fall, dass Sie nur prüfen, ob im Zusammenhang Modell in der Besetzung vorhanden ist, so sollten Sie verwenden:
|> assoc_constraint(:user)
Dies lässt sich aber nicht vom Benutzer, sondern prüft, ob gegeben user_id
in der Datenbank vorhanden ist. Nun, wenn Sie das Abonnement für einen Benutzer aktualisieren möchten, können Sie dies tun:
user = Repo.get(User, id)
subscription = Ecto.build_assoc(user, :subscriptions, other_fields_as_map)
Hinweis erfordert has_one
oder has_many
auf dem Benutzermodell.
Oder Sie können einfach die Benutzer-ID aktualisieren, wie Sie versuchten vor:
Rebirth.Subscription.update_user(subscription, %{user_id: 1})
und dieses Mal wird es die Datenbank überprüfen, ob bestimmte Benutzer-ID vorhanden ist, aber Sie werden nicht Objekt gesamte Benutzer übergeben werden können, Hier.
Und wenn Sie verknüpfte Benutzer aktualisieren möchten, müssen Sie es explizit in zwei Schritten tun. a) Holen Sie den Benutzer, b) Aktualisieren Sie den Benutzer mit Changeset in seinem Modul definiert.
Endgültig, wenn Sie keine separate Validierung für die Aktualisierung von Benutzern machen (und ich denke nicht, dass Sie in diesem Szenario sollten), wäre es gut, die Funktion von update_user
zu changeset
umzubenennen. Derselbe Changeset kann zum Erstellen und Aktualisieren von Modellen verwendet werden.
Ich habe derzeit das gleiche Problem.:/ –
Ich habe noch keinen Weg gefunden, es zu reparieren, aber ich grabe herum, ich isolierte das Problem auf 'Ecto.Changeset.cast_relation/4'. Insbesondere "Map.get (Typen, Schlüssel)". Die Assoziation gehört nicht zu den Modellen "Typen". –
Nun, meine "es ist mitten in der Nacht und ich bin müde von diesem" Lösung ist die "Cast_assoc" zu entfernen und 'user_id' zu der Liste der erforderlichen Parameter hinzufügen. Es ist eine anständige temporäre Abhilfe. –