Elixir 嵌入模式的唯一约束
有没有办法让一个唯一的约束对一个嵌入的模式起作用 下面给出的代码给出了例外情况: 无法将约束添加到变更集,因为它没有源 字段Elixir 嵌入模式的唯一约束,elixir,phoenix-framework,ecto,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.valid
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
作为参数输入,但没有成功
有没有办法让一个唯一的约束对一个嵌入的模式起作用
简而言之,答案是否定的
Ecto的唯一约束依赖于数据库。为了工作,您需要为给定字段添加唯一索引。该约束只会将数据库错误转换为变更集错误。您可以在文档中阅读更多内容
编辑:
使用embedded_schema
意味着您不能在电子邮件
的“字段”上有唯一的索引,因为它本身不是字段。EXTO使用一个jsonb
字段来存储嵌入的数据
您可以创建一个与数据库相关的帐户
架构。然后,您可以手动将数据映射到帐户变更集,并对其使用unique\u约束
。它不会存储为JSON。name
字段存储在persons
表中,而email
字段存储在accounts
表中。所以我想我可以使用一个约束。小背景信息:我正在试用insert_all
(),因此我制作了一个表格,用一些帐户信息创建了一个新的“人”,比如电子邮件。您仍然不能对此变更集设置唯一\u约束
,因为其架构与数据库无关。您可以定义Account
schema,并对Account变更集设置unique\u约束。因此,您必须手动将数据映射到帐户
变更集,该变更集将使用唯一约束。这就是我要做的。但我认为有一种方法可以做到这一点,而不必将其映射到帐户模型/请您发布模块的代码好吗?您是否必须设置使用App.Web,:model
?