有没有办法让一个独特的约束适用于嵌入式架构?
下面给出的代码给出了例外:
无法为变更集添加约束,因为它没有源
字段name
来自persons
email
和字段accounts
架构:
embedded_schema do
field :name
field :email
end
变更集:
struct
|> Ecto.Changeset.cast(params, [:name, :email])
|> Ecto.Changeset.validate_required([:name, :email])
|> Ecto.Changeset.unique_constraint(:email)
我尝试将架构accounts
作为参数提供,但没有成功。
答案 0 :(得分:1)
有没有办法让独特的约束适用于嵌入式架构?
简短的回答是否定的。
Ecto' s unique_constraint
依赖于数据库。为了工作,您需要为给定字段添加唯一索引。约束只会将数据库错误转换为更改集错误。您可以在文档https://hexdocs.pm/ecto/Ecto.Changeset.html#unique_constraint/3
修改强>
使用 embedded_schema
表示您无法在email
"字段"上拥有唯一索引,因为它本身不是字段。 Ecto使用单个jsonb
字段来存储嵌入数据。
您可以创建与数据库相关的Account
架构。然后,您可以手动将数据映射到帐户更改集,并在其上使用unique_constraint
。