Я думал, что это так же, как и активная запись в Ruby, но похоже, что это не
Ответ 1
Вы хотите использовать unique_constraint/3. Это не похоже на Active Record, потому что она использует базу данных для обеспечения уникальности. Active Record выполнила бы запрос для записей с одинаковым значением, и если бы они были возвращены, это не получилось бы. Это условие гонки, в котором, если значение вставлено между выборкой для проверки уникальности и вставки вашей записи, вы либо закончите с дублирующимися данными, либо с повышением ошибки (в зависимости от того, установлен ли индекс в базе данных или нет). t20 > не имеет этого состояния гонки.
Следует отметить одно: поскольку уникальность неизвестна до тех пор, пока не будет предпринята попытка вставки, единственное ограничение произойдет после ваших проверок. Невозможно одновременно отображать ошибки проверки и ограничения.
Используемая вами база данных также должна поддерживать уникальные ограничения. Они не будут работать с SQLite. Вы можете узнать больше о проблеме GitHub.
Стоит отметить, что Ecto использовал функцию validate_unique/3, которая работала при выполнении запроса в базе данных, однако она устарела в пользу unique_constraint/3 В версии 0.16 0,0