elixir - get_by - Ecto borrar el registro de la base de datos referenciada



elixir ecto group by (2)

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

https://hexdocs.pm/ecto/Ecto.Schema.html#has_many/3

https://ffff65535.com

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


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




ecto