首页 > 解决方案 > 当源结构的键名与模式的列名不同时创建变更集?

问题描述

这似乎是一个很容易解决的问题,但显然我无法直截了当地思考或看对了地方。

假设我有一个模式,其中的列按照约定以 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 的情况,还可能是键看起来与预期列名不同的任何情况。

标签: elixirphoenix-frameworkecto

解决方案


如果您正在编写将 JSON 发送到您的 API 的客户端,则要求您的 API 调用 JSON 密钥为蛇形大小写以匹配 API 端点。

Macro.camelizeandMacro.underscore函数也不适合某些情况,因为它们不支持 unicode 或 Elixir-identifier 中的无效字符,因此如果您想接受 camelCase 并变异为 snake_case ,您可能需要查看Case2 。

您可以有条件地实现 recase,例如,如果您收到带有 camelCase 密钥的请求,Enum.map或者Enum.filterrecase,但在大多数情况下,最好只指定您的客户端 API 调用以匹配您的后端 API 端点

编辑:将 Recase ref 更改为 Case2,因为 Recase 显然也无法处理 unicode:P


推荐阅读