如何unique
在ecto中制作一个字段?
我认为它与Ruby中的活动记录相同,但似乎不是
您想使用unique_constraint/3。这与 Active Record 不同,因为它使用数据库来确保唯一性。Active Record 将对具有相同值的记录进行查询,如果返回任何记录,则会失败。这有一个竞争条件,如果在提取以检查唯一性和插入记录之间插入一个值,您将最终得到重复数据或引发错误(取决于是否在数据库上设置了索引。unique_constraint/3
确实没有这个比赛条件。
值得注意的一件事是,由于在尝试插入之前不知道唯一性,因此唯一性约束将在您的验证之后发生。不可能同时显示验证和约束错误。
您使用的数据库也必须支持唯一约束。它们不适用于 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 版本中被弃用了