Elixir Ecto验证所需*更改*而不是字段

时间:2016-07-22 16:35:44

标签: elixir ecto

我有一个带有变更集的Ecto模型,它将改变模型中的状态属性:

def next_state_changeset(model, params) do
   model
   |> cast(params, ~w(state))
   |> validate_required(:state)
end

但是如果提交的州与模型中的状态相同(状态没有变化),我想拒绝变更集。
但是,如果没有提交状态,此代码仍会返回有效的变更集,因为如果变更集中不存在该变量集,它仍会在模型中执行。

我知道我可以验证字段是否用params提交,例如:
if params["state"] && model.state != params["state"] do ...
但我假设有一些Ecto函数来处理这样的要求

旁注:
如果团队Ecto中的任何人看到:我认为在validate_required检查模型的文档中它应该更明确。

enter image description here

因为我觉得它有点误导

1 个答案:

答案 0 :(得分:1)

当字段的值发生更改时,所有验证(validate_required,validate_inclusion等)都将对新值进行操作。所以我只想写一个验证器,如果一个字段的值没有变化,那么变换集就会无效。

def next_state_changeset(model, params) do
  model
  |> cast(params, ~w(state))
  |> validate_changed(:state)
  |> validate_required(:state)
end

def validate_changed(cs, field) do
  if Map.has_key?(cs.changes, field) do
    cs
  else
    add_error(cs, field, "didn't change")
  end
end