在ecto中创建一个独特的字段

ard*_*ama 31 elixir ecto

如何unique在ecto中创建一个字段?

我认为它与Ruby中的活动记录相同,但似乎不是

Gaz*_*ler 65

您想使用unique_constraint/3.这与Active Record不同,因为它使用数据库来确保唯一性.Active Record会对具有相同值的记录进行查询,如果有任何返回,则会失败.这具有这样,如果一个值被插入取来检查的独特性和插入你的记录之间的竞争条件,你要么出现重复的数据或正在引发错误(取决于如果索引在数据库上设置或不.unique_constraint/3不没有这种竞争条件.

值得注意的是,由于在尝试插入之前不知道唯一性,因此在验证之后将发生唯一约束.无法同时显示验证和约束错误.

您使用的数据库也必须支持唯一约束.它们不适用于SQLite.您可以阅读有关GitHub问题的更多信息.

在您的迁移中:

create unique_index(:users, [:email])
Run Code Online (Sandbox Code Playgroud)

然后在你的模型中:

cast(user, params, ~w(email), ~w())
|> unique_constraint(:email)
Run Code Online (Sandbox Code Playgroud)

值得一提的是,外生用于提供validate_unique/3该工作通过对数据库进行查询的功能,但它是在赞成不赞成unique_constraint/3版本0.16.0