如何验证映射字段是否在ECTO模型中具有某个键(而不是在控制器中)



我需要将地图作为字段存储在我的数据库中(数据源是JSON(。为了使数据有效,JSON需要具有特定键,即,键也必须存在于转换后的Elixir Map中。

应该在模型模块中执行此验证,而不是手动检查控制器中的密钥,然后将错误添加到add_error中。但是,我已经研究了ECTO文档,但是到目前为止,验证似乎都是关于map本身键入的简单字段,例如检查string字段是否匹配某个正则义务。我似乎无法找到一种简单的方法来做到这一点。我做错了吗?

您可以编写自己的验证功能,例如,请查看此处https://stackoverflow.com/a/35331889/2064880或在这里https://medium.com/@quantlayer/写作custom-validations-for-ecto-changeSets-4971881C7684。

因此,对于您的用例,也许会有类似的用法:

def changeset(struct, params \ %{}) do
  struct
  |> cast(attrs, [:map_field])
  |> validate_key_exists()
end
defp validate_key_exists(%Ecto.Changeset{changes:
      %{map_field: %{the_special_key: _value}}} = changeset) do
  changeset
end
defp validate_key_exists(changeset) do
  add_error(changeset, :map_field, "Missing special key.")
end

最新更新