我需要将地图作为字段存储在我的数据库中(数据源是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