elixir - 如何验证嵌套地图中的要求
问题描述
我正在使用 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 所需的内容?谢谢!
解决方案
您可以为元数据创建另一个架构,并嵌入一个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。你可以编写自己的验证函数,这里有一个关于如何做到这一点的例子。
推荐阅读
- php - 显示 Woocommerce 选择的产品变体价格(含税和不含税)
- excel - 包含日期的文本框为空时出现运行时错误 13
- octave - 如何将 symprod 与符号数组一起使用?
- c# - Naudio:在BackgroundWorker中编码->创建了空目标文件,应用程序关闭并且没有抛出异常
- php - 无法在 PHP 网页中进行 MySQL 查询
- c++ - 使用 Q_DECLARE_METATYPE 注册许多类是否有负面影响?
- react-native - react-navigation 站点中不再提供 createNativeStackNavigator
- javascript - 如何使用 reduce() 返回一个对象?
- javascript - RxJs:如何关闭嵌套 observable.subscribe 调用的订阅
- python - 为 Python 排序大文件