Return Ecto 查询中的所有字段作为地图发送结果 json?
Return all fields in Ecto query as a map for sending results back as json?
如果我不放置 select,则 ecto return 是有意义的完整结构,但我必须转换为映射并删除 __meta__
字段。
from x in __MODULE__
将 return 列表 %MODULE{__meta__: #Ecto.Schema.Metadata...,id: 1, name: "bob"}
有没有比在 select 子句中列出更好的解决方案,如下所示:
from x in __MODULE__, select: %{x.id: id, x.name: name...}
如果没有,是否有办法从架构中动态生成此 select 子句?
虽然我没有发现调用 Map.from_struct/1
有任何问题,但正确的方法是为相关结构实施 json
编码器。然后您就可以随时序列化结构本身。
对于Jason
it’s fairly straightforward with @derive
:
defmodule MySchema do
@derive Jason.Encoder
schema ...
end
您可以使用带有 except
选项的 @derive
模块注释将您不想编码的字段列入黑名单 JSON。
例如:
defmodule MyStruct do
...
@derive {Jason.Encoder, except: [:__meta__, ...]}
end
但是,请记住,使用此注释可能会破坏应用程序层,因为您会将表示问题与数据表示问题混合在一起。
因此,更好的方法是:
Protocol.derive(Jason.Encoder, NameOfTheStruct, only: [...])
Protocol.derive(Jason.Encoder, MyStruct, except: [...])
当您不是该结构的所有者时,您也可以这样做。
有关详细信息,您可以查看 Jason 的文档。
如果我不放置 select,则 ecto return 是有意义的完整结构,但我必须转换为映射并删除 __meta__
字段。
from x in __MODULE__
将 return 列表 %MODULE{__meta__: #Ecto.Schema.Metadata...,id: 1, name: "bob"}
有没有比在 select 子句中列出更好的解决方案,如下所示:
from x in __MODULE__, select: %{x.id: id, x.name: name...}
如果没有,是否有办法从架构中动态生成此 select 子句?
虽然我没有发现调用 Map.from_struct/1
有任何问题,但正确的方法是为相关结构实施 json
编码器。然后您就可以随时序列化结构本身。
对于Jason
it’s fairly straightforward with @derive
:
defmodule MySchema do
@derive Jason.Encoder
schema ...
end
您可以使用带有 except
选项的 @derive
模块注释将您不想编码的字段列入黑名单 JSON。
例如:
defmodule MyStruct do
...
@derive {Jason.Encoder, except: [:__meta__, ...]}
end
但是,请记住,使用此注释可能会破坏应用程序层,因为您会将表示问题与数据表示问题混合在一起。 因此,更好的方法是:
Protocol.derive(Jason.Encoder, NameOfTheStruct, only: [...])
Protocol.derive(Jason.Encoder, MyStruct, except: [...])
当您不是该结构的所有者时,您也可以这样做。
有关详细信息,您可以查看 Jason 的文档。