我有一个带有变更集的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
检查模型的文档中它应该更明确。
因为我觉得它有点误导
答案 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