当Struct或nil通过时,对belongs_to进行validate_required

时间:2016-11-26 04:30:13

标签: elixir belongs-to ecto

在显式传递关联的情况下对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

1 个答案:

答案 0 :(得分:1)

验证主要用于处理用户输入,而不是确保数据一致性。如果您以编程方式创建数据,则验证不是防范程序员错误的正确工具(如果有人忘记添加关联) - 数据库约束是。

在处理关联的用户输入时,cast_assoc/3cast_embed/3等函数会接受required: true选项来强制关联的存在。

创建一个能够做正确的事情并添加关联的函数可能是一个好主意,而不是在控制器(或调用变更集函数的其他地方)上散布该逻辑。