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 如何设置一个EXTO变更集,以防止丢失必需字段的模型被保存?_Elixir_Phoenix Framework_Ecto - Fatal编程技术网

Elixir 如何设置一个EXTO变更集,以防止丢失必需字段的模型被保存?

Elixir 如何设置一个EXTO变更集,以防止丢失必需字段的模型被保存?,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,根据菲尼克斯的文件: 插入(exto.Schema.t | exto.Changeset.t,Keyword.t):{:好, exto.Schema.t}{:错误,exto.Changeset.t} 插入模型或变更集 在给定模型的情况下,该模型将转换为具有 作为变更集一部分的所有模型非虚拟字段。这一转变 通过直接调用exto.Changeset.change/2完成 在给定变更集的情况下,将合并变更集中的变更 使用模型字段,并将所有字段发送到数据库 如果在中注册了\u insert之前或之后的任

根据菲尼克斯的文件:

插入(exto.Schema.t | exto.Changeset.t,Keyword.t):{:好, exto.Schema.t}{:错误,exto.Changeset.t}

插入模型或变更集

在给定模型的情况下,该模型将转换为具有 作为变更集一部分的所有模型非虚拟字段。这一转变 通过直接调用exto.Changeset.change/2完成

在给定变更集的情况下,将合并变更集中的变更 使用模型字段,并将所有字段发送到数据库

如果在中注册了\u insert之前或之后的任何回调 给定模型,将使用变更集调用它们

如果模型已成功插入或删除,则返回{:确定,模型} {:错误,变更集}如果存在验证或已知约束 错误

我所做的 我所期望的 我预期会出现错误,因为
sms\u号码
必需的

我到底得到了什么
[debug]插入“users”(“inserted_at”,“updated_at”,“email”,“sms_number”,“username”)值($1,$2,$3,$4,$5)返回“id”[{{{2016,3,19},{15,13,5,0},{2016,3,19},{15,13,5,0},nil,nil,nil]OK query 1.5ms
%Dollar.User{{uuuuu meta}:{35; exto.Schema.Metadata,电子邮件:nil,id:7,
插入地址:#exto.DateTime,短信号码:nil,
更新地址:#exto.DateTime,用户名:nil}
记录存储在数据库中

环境
  • 长生不老药1.2.3
  • 外胚层1.1.4
  • 凤凰外星2.0.1
  • 凤凰城1.1.4

我做错了什么?

当您试图直接插入模型中定义的结构时,
变更集
函数根本不被调用<代码>%User{}只是模块中的一个结构,而EXTO对该模块中定义的函数一无所知。您可以删除
changeset
函数和
Repo。insert
仍然有效

changeset
函数是您的自定义验证代码。粘贴的文档声明调用了另一个函数:
exto.Changeset.change/2
。它创建一个默认情况下有效的变更集,并且不需要任何字段

你可以自己试试:

changeset = Ecto.Changeset.change %User{}
changeset.required # []
changeset.valid?   # true
new_changeset = User.changeset changeset
new_changeset.required # [:sms_number]
new_changeset.valid?   # false
在插入数据库之前,请始终运行自定义验证,并将
Repo.insert
与变更集而不是原始结构一起使用。在迁移过程中,使用NOTNULL约束在数据库本身上强制使用必填字段可能也是一个好主意:

add :username, :string, null: false

看来我犯了个新手错误。谢谢你的解释!关于我的模式中字段的
null
选项,您是对的。我想稍后再补充这一点。
changeset = Ecto.Changeset.change %User{}
changeset.required # []
changeset.valid?   # true
new_changeset = User.changeset changeset
new_changeset.required # [:sms_number]
new_changeset.valid?   # false
add :username, :string, null: false