get_by - install ecto elixir
Ecto borrar el registro de la base de datos referenciada (2)
Tengo 2 mesas:
usuario:
id
username
password
unique_index username
(the schema has a has_many other)
otro:
id
user_id - references(:users)
foo
index user_id
(the schema has a belongs_to user)
en el conjunto de cambios para "Otro" tengo esto
model
|> cast(params, @req, @opt)
|> foreign_key_constraint(:user_id)
Mi suposición en este punto era que el "Otro" modelo ecto requiere que un "Usuario" esté asociado a él para que exista (que es lo que quiero)
Pero mi segunda suposición fue que si elimino el registro de "Usuario", todos los registros asociados "Otros" se eliminarían (a través de una eliminación de Cascade)
Lo que realmente sucede es que tengo un error Ecto.Constraint al intentar eliminar un registro de "Usuario" (supongo que porque hay un registro "Otro" asociado a ese usuario)
Entonces, ¿cómo puedo hacer para que funcione de la manera que quiero, que es:
- Un "usuario" se puede crear de forma independiente
- Se puede crear un "otro" pero debe pertenecer a un "usuario"
- Cuando se elimina un "otro" no afecta a nada más.
- Cuando se elimina un "usuario", también se eliminan todos los registros "otros" asociados
Esencialmente, una eliminación de cascada en el usuario para cualquier elemento que lo haga referencia
Lo descubrí, en el tiene muchos puedes pasar una opción on_delete
así que el has_many se ve así
has_many :other, Project.Other, on_delete: :delete_all
Los documentos son muy útiles: p
Puede hacerlo de la manera que especificó en su esquema usando:
has_many :other, Project.Other, on_delete: :delete_all
Sin embargo, es posible que esté mejor haciendo esto en su migración con references/2 :
create table(:others) do
add :user_id, references(:users, on_delete: :delete_all)
end
Esto usará restricciones de clave externa de la base de datos y se menciona en la documentación de has_many
:
: on_delete: la acción que se realiza en las asociaciones cuando se elimina el modelo principal. Puede ser: nada (predeterminado),: nilify_all y: delete_all. Aviso: on_delete también se puede configurar en migraciones al crear una referencia. Si es compatible, se prefiere confiar en la base de datos a través de migraciones.
Puedes cambiar un índice existente con:
drop_if_exists index(:others, [:user_id])
alter table(:others) do
modify :user_id, references(:users, type: :uuid, on_delete: :delete_all)
end