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

Database 如何验证映射字段是否在EXTO模型中(而不是在控制器中)具有某个键?,database,elixir,phoenix-framework,Database,Elixir,Phoenix Framework,我需要将地图作为字段存储到数据库中(数据源是JSON)。为了使数据有效,JSON需要有一个特定的密钥,即该密钥也必须存在于转换后的Elixir映射中 最好在模型模块内执行此验证,而不是在控制器内手动检查钥匙,然后使用add\u error添加错误。然而,我已经查阅了EXTO文档,但到目前为止,验证似乎都是关于简单字段的,这些字段本身不是map类型,例如检查字符串字段是否匹配某个正则表达式。我似乎找不到一个简单的方法来做这件事。我做错了吗?您可以编写自己的验证函数,例如,查看此处或此处 因此,对于

我需要将地图作为字段存储到数据库中(数据源是JSON)。为了使数据有效,JSON需要有一个特定的密钥,即该密钥也必须存在于转换后的Elixir映射中


最好在模型模块内执行此验证,而不是在控制器内手动检查钥匙,然后使用
add\u error
添加错误。然而,我已经查阅了EXTO文档,但到目前为止,验证似乎都是关于简单字段的,这些字段本身不是
map
类型,例如检查
字符串
字段是否匹配某个正则表达式。我似乎找不到一个简单的方法来做这件事。我做错了吗?

您可以编写自己的验证函数,例如,查看此处或此处

因此,对于您的用例,类似这样的东西可能会起作用:

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

谢谢你的指点。由于某些原因,您的代码无法工作。。。似乎Elixir无法匹配嵌套键的模式,或者可能存在其他一些复杂情况。但是按照另一个SO答案中列出的方法,我能够首先从变更集中检索
:map\u字段
,然后使用
map.has\u key?
来检查
特殊的\u key
,这是有效的。