elixir - 当源结构的键名与模式的列名不同时创建变更集?
问题描述
这似乎是一个很容易解决的问题,但显然我无法直截了当地思考或看对了地方。
假设我有一个模式,其中的列按照约定以 snake_case 命名,例如branch_id
.
通常,如果数据来自 Phoenix 表单,您将拥有与模式的键完全对应的数据键,以便您可以编写%MyStruct{} |> cast(attrs, [:branch_id])
等。
但是,在我的 JSON API 中,传入的 JSON 对象将具有 camelCase 中的键,例如"branchId"
.
是否有任何函数Ecto.Changeset
可以用来方便地将传入数据中的这些键对应到我的模式中的列?
一个明显的解决方案是(在控制器中)Enum.map
首先处理传入的 JSON,用于Macro.underscore
转换键,并将结果收集回映射,然后将其传递给changeset
函数。然而,这似乎真的是多余的和低效的。
这不仅限于snake_case 与camelCase 的情况,还可能是键看起来与预期列名不同的任何情况。
解决方案
如果您正在编写将 JSON 发送到您的 API 的客户端,则要求您的 API 调用 JSON 密钥为蛇形大小写以匹配 API 端点。
Macro.camelize
andMacro.underscore
函数也不适合某些情况,因为它们不支持 unicode 或 Elixir-identifier 中的无效字符,因此如果您想接受 camelCase 并变异为 snake_case ,您可能需要查看Case2 。
您可以有条件地实现 recase,例如,如果您收到带有 camelCase 密钥的请求,Enum.map
或者Enum.filter
recase,但在大多数情况下,最好只指定您的客户端 API 调用以匹配您的后端 API 端点
编辑:将 Recase ref 更改为 Case2,因为 Recase 显然也无法处理 unicode:P
推荐阅读
- java - Java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()
- python - 如何在字典中获取最大值,并将值作为点亮?
- encryption - 彩虹表如何破解不同长度的密码?
- angularjs - 如何更改所选手风琴的标题颜色?
- javascript - 在 AngularJs 中创建调查表
- hive - Apache Kylin 是否仍然可以与 Mondrian 4.4 和 Saiku CE 一起使用?
- javascript - React 图像轮播 | 特色图像模式
- linux - 如果第一行与模式匹配,则 Sed 在文件的第一行插入字符串
- sql - 有没有一种方法可以在不使用分析函数或相关子查询的情况下在 sql 中执行排名?
- react-native - 如何清除基于本机的输入文本?