elixir - get_by - palabras con ecto
Haciendo un campo Ășnico en ecto. (1)
¿Cómo hacer un campo unique
en ecto?
Pensé que es lo mismo que el registro activo en Ruby, pero parece que no lo es.
Quieres usar unique_constraint/3 . Esto no es como Active Record porque utiliza la base de datos para garantizar la exclusividad. Active Record haría una consulta para los registros con el mismo valor y si se devolviera alguno, fallaría. Esto tiene una condición de carrera en la que, si se inserta un valor entre la búsqueda para verificar la unicidad y la inserción de su registro, terminará con datos duplicados o se generará un error (dependiendo de si un índice está establecido en la base de datos o no. unique_constraint/3
no tiene esta condición de raza.
Una cosa que vale la pena señalar es que, dado que la singularidad no se conoce hasta que se intenta realizar una inserción, la restricción única ocurrirá después de las validaciones. No es posible mostrar los errores de validación y restricción a la vez.
La base de datos que está utilizando también debe soportar restricciones únicas. No trabajarán con SQLite. Puedes leer más sobre el tema de GitHub .
En su migración:
create unique_index(:users, [:email])
Entonces en tu modelo:
cast(user, params, ~w(email), ~w())
|> unique_constraint(:email)
Vale la pena señalar que Ecto solía proporcionar una función validate_unique/3
que funcionaba al hacer una consulta en la base de datos, sin embargo, estaba en desuso en favor de unique_constraint/3
en la versión 0.16.0