cast_assoc
è usato per "modello fuso associato" e può essere utilizzato solo con has_one
e has_many
. La relazione belongs_to
definisce l'ID esterno nel modello in cui è stato richiamato. has_many
e has_one
si basano su "l'altro" oggetto con chiave esterna.
Se si crea un oggetto con molti altri oggetti, è consigliabile controllarli tutti se sono validi. cast_assoc
invocherà cast
nei rispettivi moduli.
L'utente può avere molti abbonamenti (probabilmente, sto indovinando qui), quindi non ha senso creare utente quando si crea un abbonamento e verificare se l'utente è valido tramite cast_assoc
. Solitamente in questo caso l'utente esisterà già nel database.
Nel tuo caso si desidera solo verificare se il modello associato esiste nel cast, così si dovrebbe usare:
|> assoc_constraint(:user)
Questo non convalida utente, ma controlla se dato user_id
esiste nel database. Ora, quando si desidera aggiornare l'abbonamento per un utente si può fare questo:
user = Repo.get(User, id)
subscription = Ecto.build_assoc(user, :subscriptions, other_fields_as_map)
Nota richiede has_one
o has_many
sul modello utente.
Oppure si può semplicemente aggiornare l'ID utente come si è tentato prima:
Rebirth.Subscription.update_user(subscription, %{user_id: 1})
e questa volta sarà controllare il database se non esiste dato user id, ma non sarà in grado di passare intero oggetto utente Qui.
E se si desidera aggiornare l'utente associato, sarà necessario farlo esplicitamente in due passaggi. a) ottenere l'utente, b) aggiornare l'utente usando il changeset definito nel suo modulo.
Nota finale, se non si effettua la convalida separata per l'aggiornamento degli utenti (e non penso che si dovrebbe in questo scenario), sarebbe bene rinominare la funzione da update_user
a changeset
. Lo stesso changeset può essere utilizzato per creare e aggiornare i modelli.
Attualmente sto riscontrando lo stesso problema.:/ –
Non ho ancora trovato un modo per risolverlo, ma scavando intorno, ho isolato il problema a 'Ecto.Changeset.cast_relation/4'. In particolare, 'Map.get (types, key)'. L'associazione non è uno dei "tipi" di modelli. –
Bene, la mia soluzione "è il cuore della notte e sono stanco di questa" è rimuovere il 'cast_assoc' e aggiungere' user_id' alla lista dei parametri richiesti. È una soluzione temporanea decente. –