query get_by etimologia elixir ecto

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



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