我在尝试实现自定义变更集验证时遇到了一些麻烦。我的架构是:
defenum(VersionStateEnum, ["draft", "active"])
schema "versions" do
field :expires_at, :utc_datetime
field :state, VersionStateEnum
end
我正在尝试实施的验证是:只有在状态为草稿时才能设置 expires_at(这也应该对更新有效,如果状态仍然是草稿,我应该无法删除 expires_at)我尝试了以下:
defp validate_expires_at(changeset) do
expires_at = get_change(changeset, :expires_at)
cond do
get_change(changeset, :state) == :draft ->
case expires_at do
nil -> add_error(changeset, :expires_at, "can't be blank when state is draft")
_ -> changeset
end
get_change(changeset, :state) == :active ->
case expires_at do
nil -> changeset
_ -> add_error(changeset, :expires_at, "cannot be set when state is not draft")
end
true ->
changeset
end
end
end
但它并没有真正起作用,因为即使状态是草稿,我也可以将 expires_at 更新为 nil 。任何帮助表示赞赏。
编辑 1:我的变更集:
@required_fields [
:state
]
@optional_fields [:expires_at]
def changeset(model, params \\ nil) do
model
|> cast(params, @required_fields ++ @optional_fields)
|> validate_required(@required_fields)
|> validate_expires_at()
end
它被称为:
def create_document(attrs \\ %{}) do
%Document{}
|> Document.changeset(attrs)
|> Repo.insert()
end