Elixir 如何设置一个EXTO变更集,以防止丢失必需字段的模型被保存?
根据菲尼克斯的文件: 插入(exto.Schema.t | exto.Changeset.t,Keyword.t):{:好, exto.Schema.t}{:错误,exto.Changeset.t} 插入模型或变更集 在给定模型的情况下,该模型将转换为具有 作为变更集一部分的所有模型非虚拟字段。这一转变 通过直接调用exto.Changeset.change/2完成 在给定变更集的情况下,将合并变更集中的变更 使用模型字段,并将所有字段发送到数据库 如果在中注册了\u insert之前或之后的任何回调 给定模型,将使用变更集调用它们 如果模型已成功插入或删除,则返回{:确定,模型} {:错误,变更集}如果存在验证或已知约束 错误 我所做的 我所期望的 我预期会出现错误,因为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之前或之后的任
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