38

如何unique在ecto中制作一个字段?

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

4

1 回答 1

73

您想使用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/30.16.0 版本中被弃用了

于 2015-09-08T14:52:35.513 回答