Подтвердить что ты не робот

Создание уникального поля в ecto

Как создать поле unique в ecto?

Я думал, что это так же, как и активная запись в Ruby, но похоже, что это не

4b9b3361

Ответ 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