首页 > 解决方案 > 如何验证嵌套地图中的要求

问题描述

我正在使用 Elixir。

我收到了一些属性,我正在使用它们来创建一个location. 属性类似于:

attrs = %{latitude: 123.2, longitude: 123.4, metadata: %{timestamp: "2015-05-05T01:31:54", accuracy: 1}}

要创建我使用:

location
|> cast(attrs, [:latitude, :longitude, :metadata])
|> validate_required([:latitude, :longitude])

有没有一种方法可以验证 metadata.timestamp 所需的内容?谢谢!

标签: elixir

解决方案


您可以为元数据创建另一个架构,并嵌入一个Metadata. 这将使您能够转换和验证元数据中的字段。这就是代码的样子:

defmodule Location do
  use Ecto.Schema

  schema "location" do
    field :latitude, :float
    field :longitude, :float
    embeds_one :metadata, Metadata
  end

  def changeset(location, attrs) do
     location
     |> cast(attrs, [:latitude, :longitude, :metadata])
     |> validate_required([:latitude, :longitude])
     |> cast_embed(:metadata)
  end
end

和您的元数据:

defmodule Metadata do
  use Ecto.Schema

  embedded_schema do
    field :timestamp, :utc_datetime
    field :accuracy, :integer
  end

  def changeset(metadata, attrs) do
    location
    |> cast(attrs, [:timestamp, :accuracy])
    |> validate_required([:timestamp])
  end
end

这将是使用 Ecto Schemas 验证嵌套映射的结构方式,但 ofc。你可以编写自己的验证函数,这里有一个关于如何做到这一点的例子。


推荐阅读