这似乎是一个非常容易解决的问题,但显然我无法直视或寻找正确的地方。
假设我有一个架构,其中列按约定在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的情况,而且还可能涉及键看起来与预期的列名不同的任何情况。
答案 0 :(得分:1)
如果您正在编写将JSON发送到您的API的客户端,则要求您的API调用JSON密钥为snake_case以匹配API端点。
Macro.camelize
和Macro.underscore
函数也不适用于某些情况,因为它们do not support unicode or invalid-in-Elixir-identifier characters,因此如果您想接受camelCase和变异为snake_case。
您可以有条件地执行recase,例如如果您收到带有Enum.map
或Enum.filter
的camelCase密钥的请求并重新设置大小写,但是在大多数情况下,最好仅指定客户端API调用以匹配后端API端点
编辑:将Recase ref更改为Case2,因为Recase显然也不能处理unicode:P