Ecto 变更集添加多个错误

Ecto changeset add multiple errors

我有一个要在变更集中验证的配置映射。配置有多个键,每个键都有一些限制。

我可以 运行 在接收到数据时为它们中的每一个设置一个验证器,但这迫使我编写很多代码,这些代码可以更智能地完成,所以我 运行 宁一个循环和试图收集所有失败的验证,而不是 运行 一个一个地收集它们。

defp validate_config_flags(changeset) do
    config = get_field(changeset, :config)

    for  {k, v} <- config  do
        if !Map.has_key?(@config_flags, k) || !validate_config_flag(k, v) do
            add_error(changeset, :"#{k}", "Invalid value for `#{k}`")
        end
    end

    changeset
end

Obv 我的问题是我 return changeset 即使某些字段失败并且我的问题与此相关。如何向结果添加多个错误 message/failed 验证,而不是在第一个 add_error 不知何故 returning?

大多数时候,当你想在 Elixir 中重复修改一个术语时,你正在寻找 Enum.reduce/3:

defp validate_config_flags(changeset) do
  Enum.reduce(get_field(changeset, :config), changeset, fn {k, v}, changeset ->
    if !Map.has_key?(@config_flags, k) || !validate_config_flag(k, v) do
      add_error(changeset, :"#{k}", "Invalid value for `#{k}`")
    else
      changeset
    end
  end)
end

此代码与您的代码相同,但它会在每一步跟踪 add_error 返回的新 changeset,类似于以下 if Elixir有可变变量:

for {k, v} <- config  do
  if !Map.has_key?(@config_flags, k) || !validate_config_flag(k, v) do
    changeset = add_error(changeset, :"#{k}", "Invalid value for `#{k}`")
  end
end