Ответ 1
Вы хотите использовать unique_constraint/3. Это не похоже на Active Record, потому что она использует базу данных для обеспечения уникальности. Active Record выполнила бы запрос для записей с одинаковым значением, и если бы они были возвращены, это не получилось бы. Это условие гонки, в котором, если значение вставлено между выборкой для проверки уникальности и вставки вашей записи, вы либо закончите с дублирующимися данными, либо с повышением ошибки (в зависимости от того, установлен ли индекс в базе данных или нет). t20 > не имеет этого состояния гонки.
Следует отметить одно: поскольку уникальность неизвестна до тех пор, пока не будет предпринята попытка вставки, единственное ограничение произойдет после ваших проверок. Невозможно одновременно отображать ошибки проверки и ограничения.
Используемая вами база данных также должна поддерживать уникальные ограничения. Они не будут работать с SQLite. Вы можете узнать больше о проблеме GitHub.
В вашей миграции:
create unique_index(:users, [:email])
Затем в вашей модели:
cast(user, params, ~w(email), ~w())
|> unique_constraint(:email)
Стоит отметить, что Ecto использовал функцию validate_unique/3
, которая работала при выполнении запроса в базе данных, однако она устарела в пользу unique_constraint/3
В версии 0.16 0,0