在显式传递关联的情况下对Struct执行验证的正确方法是什么?
def changeset(model, params \\ %{}) do
model
|> cast(params, [:name])
|> validate_required([:make, :name])
|> update_change(:name, &String.downcase/1)
|> unique_constraint(:name, name: :models_name_make_id_index)
end
我将如何使用它:
changeset(%Model{make: make}, %{....})
制作可以是零。我想要正确的错误消息而不是:
** (UndefinedFunctionError) function nil.id/0 is undefined or private
答案 0 :(得分:1)
验证主要用于处理用户输入,而不是确保数据一致性。如果您以编程方式创建数据,则验证不是防范程序员错误的正确工具(如果有人忘记添加关联) - 数据库约束是。
在处理关联的用户输入时,cast_assoc/3
和cast_embed/3
等函数会接受required: true
选项来强制关联的存在。
创建一个能够做正确的事情并添加关联的函数可能是一个好主意,而不是在控制器(或调用变更集函数的其他地方)上散布该逻辑。