Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 嵌入模式的唯一约束_Elixir_Phoenix Framework_Ecto - Fatal编程技术网

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