我的用户模型中有以下内容:
def changeset(user, attrs) do
user
|> cast(attrs, [:login, :email])
|> validate_required([:login, :email])
|> unique_constraint(:login)
|> unique_constraint(:email)
end
但是仅以这种方式设置unique_contraint无效。测试控制器时,我仍然收到重复的登录名和电子邮件。
我完成了这项工作,但是我不得不在模型架构中将:unique
关键字参数设置为true
,并在迁移中为每列创建一个唯一索引。
除PostgreSQL唯一索引外,Ecto是否不检查约束本身?向unique_constraint
函数添加changeset/2
有什么意义吗?
唯一约束通过依赖数据库来检查是否违反了唯一约束,如果是,
Ecto
会将其转换为变更集错误。 —Ecto.Changeset.unique_constraint/3
也就是说,Ecto.Changeset.unique_constraint/3
一直存在的原因是为了统一错误(使更改集错误与从DB接收到的错误无关。这显然可以简化错误并使之标准化)。>>
[unique_constraint/3
显然不依靠DB本身无法检查约束。