嵌入式架构的唯一约束

时间:2016-06-26 17:37:57

标签: elixir phoenix-framework ecto

有没有办法让一个独特的约束适用于嵌入式架构?

下面给出的代码给出了例外:

  

无法为变更集添加约束,因为它没有源

字段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作为参数提供,但没有成功。

1 个答案:

答案 0 :(得分:1)

  

有没有办法让独特的约束适用于嵌入式架构?

简短的回答是否定的。

Ecto' s unique_constraint依赖于数据库。为了工作,您需要为给定字段添加唯一索引。约束只会将数据库错误转换为更改集错误。您可以在文档https://hexdocs.pm/ecto/Ecto.Changeset.html#unique_constraint/3

中阅读更多内容

修改

使用embedded_schema表示您无法在email"字段"上拥有唯一索引,因为它本身不是字段。 Ecto使用单个jsonb字段来存储嵌入数据。

您可以创建与数据库相关的Account架构。然后,您可以手动将数据映射到帐户更改集,并在其上使用unique_constraint