当源结构的键名与模式的列名不同时创建变更集?
Creating changesets when the key names of source struct differ from the column names of the schema?
这似乎是一个很容易解决的问题,但显然我还没有想清楚或看不到正确的地方。
假设我有一个架构,其中的列按照惯例在 snake_case 中命名,例如branch_id
.
通常情况下,如果数据来自 Phoenix 表单,您的数据键将与架构的键完全对应,这样您就可以编写 %MyStruct{} |> cast(attrs, [:branch_id])
等
但是,在我的 JSON API 中,传入的 JSON 对象将具有驼峰式的键,例如"branchId"
.
我可以使用 Ecto.Changeset
中的任何函数方便地将传入数据中的此类键对应到我的架构中的列吗?
一个明显的解决方案是(在控制器中)Enum.map
首先传入 JSON,使用 Macro.underscore
转换密钥,并将结果收集回一个映射,然后将其传递给 changeset
函数。然而,这似乎真的无关紧要且效率低下。
这不仅限于 snake_case 与 camelCase 的情况,还可能包括键看起来与预期列名称不同的任何情况。
如果您正在编写将 JSON 发送到您的 API 的客户端,则要求您的 API 调用 JSON 键是 snake_case 以匹配API 端点。
Macro.camelize
和 Macro.underscore
函数也不适合某些情况,因为它们 do not support unicode or invalid-in-Elixir-identifier characters, so you may want to look into Case2 如果您想接受驼峰式命名并变异为 snake_case。
您可以有条件地实施 recase,例如如果您收到带有驼峰式键 Enum.map
或 Enum.filter
和重写的请求,但在大多数情况下,最好只指定您的客户端 API 调用以匹配您的后端 API端点
编辑:将 Recase ref 更改为 Case2,因为 Recase 显然也无法处理 unicode :P
这似乎是一个很容易解决的问题,但显然我还没有想清楚或看不到正确的地方。
假设我有一个架构,其中的列按照惯例在 snake_case 中命名,例如branch_id
.
通常情况下,如果数据来自 Phoenix 表单,您的数据键将与架构的键完全对应,这样您就可以编写 %MyStruct{} |> cast(attrs, [:branch_id])
等
但是,在我的 JSON API 中,传入的 JSON 对象将具有驼峰式的键,例如"branchId"
.
我可以使用 Ecto.Changeset
中的任何函数方便地将传入数据中的此类键对应到我的架构中的列吗?
一个明显的解决方案是(在控制器中)Enum.map
首先传入 JSON,使用 Macro.underscore
转换密钥,并将结果收集回一个映射,然后将其传递给 changeset
函数。然而,这似乎真的无关紧要且效率低下。
这不仅限于 snake_case 与 camelCase 的情况,还可能包括键看起来与预期列名称不同的任何情况。
如果您正在编写将 JSON 发送到您的 API 的客户端,则要求您的 API 调用 JSON 键是 snake_case 以匹配API 端点。
Macro.camelize
和 Macro.underscore
函数也不适合某些情况,因为它们 do not support unicode or invalid-in-Elixir-identifier characters, so you may want to look into Case2 如果您想接受驼峰式命名并变异为 snake_case。
您可以有条件地实施 recase,例如如果您收到带有驼峰式键 Enum.map
或 Enum.filter
和重写的请求,但在大多数情况下,最好只指定您的客户端 API 调用以匹配您的后端 API端点
编辑:将 Recase ref 更改为 Case2,因为 Recase 显然也无法处理 unicode :P