Norm高级用法:使用selection/2轻松实现数据字段的可选与必选控制

📅 2026/7/31 20:37:01 👁️ 阅读次数 📝 编程学习
Norm高级用法:使用selection/2轻松实现数据字段的可选与必选控制

Norm高级用法:使用selection/2轻松实现数据字段的可选与必选控制

【免费下载链接】normData specification and generation项目地址: https://gitcode.com/gh_mirrors/no/norm

Norm是一个强大的数据规范与生成工具,而selection/2函数则是其核心功能之一,它能帮助开发者轻松实现数据字段的可选与必选控制。本文将详细介绍selection/2的高级用法,让你快速掌握这一实用功能。

什么是selection/2?

selection/2是Norm框架中用于定义数据选择规则的函数,它允许你从已有的数据模式(schema)中精确选择需要的字段,并控制这些字段的必选性。通过使用selection/2,你可以灵活地定制数据结构,满足不同场景下的数据验证需求。

selection/2的基本用法

简单字段选择

selection/2最基本的用法是从一个schema中选择特定的字段。例如,假设我们有一个用户schema,包含nameageemail字段,我们可以使用selection/2只选择age字段:

assert @input == conform!(@input, selection(user_schema(), [:age]))

你也可以同时选择多个字段:

assert @input == conform!(@input, selection(user_schema(), [:age, :name]))

字段必选性控制

当使用selection/2选择字段时,这些字段会被自动设为必选。如果输入数据中缺少选中的字段,Norm会返回错误信息。例如:

assert {:error, errors} = conform(%{user: %{name: "chris"}}, selection) assert errors == [%{spec: ":required", input: %{name: "chris"}, path: [:user, :age]}]

selection/2的高级用法

嵌套schema选择

selection/2不仅支持简单的字段选择,还可以处理嵌套的schema结构。例如,如果我们有一个包含用户信息的嵌套schema,我们可以使用selection/2深入到嵌套结构中选择字段:

schema = schema(%{user: user_schema()}) selection = selection(schema, user: [:age]) assert %{user: %{age: 31}} == conform!(%{user: %{age: 31}}, selection)

结合schema验证

selection/2选择的字段会继承原schema中的验证规则。这意味着,如果原schema对某个字段有特定的验证要求,那么在selection/2中选择该字段后,输入数据仍需满足这些验证要求。例如:

assert {:error, errors} = conform(%{age: -100}, selection(user_schema(), [:age])) assert errors == [%{spec: "&(&1 > 0)", input: -100, path: [:age]}]

selection/2的实现原理

selection/2的实现位于lib/norm/core/selection.ex文件中。它通过构建一个选择器结构,记录需要选择的字段及其必选性。核心代码如下:

defstruct required: [], schema: nil def new(schema, selectors) do case selectors do :all -> selectors = build_all_selectors(schema) select(selectors, schema) _ -> validate_selectors!(selectors) select(selectors, schema) end end

selection/2函数首先会验证选择器的合法性,然后根据选择器从schema中选择字段,并构建一个包含选中字段和原schema的选择结构。在数据验证时,Norm会根据这个选择结构来检查输入数据是否满足要求。

总结

selection/2是Norm框架中一个非常实用的函数,它可以帮助开发者轻松实现数据字段的可选与必选控制。通过本文的介绍,你应该已经掌握了selection/2的基本用法和高级技巧。如果你想深入了解selection/2的更多细节,可以查看lib/norm/core/selection.ex文件的源代码,或者参考test/norm/core/selection_test.exs中的测试用例。

希望本文能够帮助你更好地使用Norm框架,提升数据验证的效率和准确性!

【免费下载链接】normData specification and generation项目地址: https://gitcode.com/gh_mirrors/no/norm

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考