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 的文档。