【问题标题】:Return all fields in Ecto query as a map for sending results back as json?将 Ecto 查询中的所有字段作为映射返回,以便将结果作为 json 发送回?
【发布时间】:2021-04-30 13:14:15
【问题描述】:

如果我没有选择,ecto 会返回完整的结构,这很有意义,但我必须转换为地图并删除 __meta__ 字段。

from x in __MODULE__ 将返回%MODULE{__meta__: #Ecto.Schema.Metadata...,id: 1, name: "bob"} 的列表

有没有比在 select 子句中列出更好的解决方案,如下所示: from x in __MODULE__, select: %{x.id: id, x.name: name...}

如果没有,有没有办法从模式中动态生成这个 select 子句?

【问题讨论】:

    标签: json elixir ecto


    【解决方案1】:

    虽然我认为调用 Map.from_struct/1 没有任何问题,但正确的方法是为相关结构实现 json 编码器。然后,您就可以随时序列化结构本身。

    对于Jason@derive 相当简单:

    defmodule MySchema do
      @derive Jason.Encoder
    
      schema ...
    end
    

    【讨论】:

      【解决方案2】:

      您可以使用带有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 的文档。

      【讨论】:

        猜你喜欢
        • 2011-05-21
        • 1970-01-01
        • 2014-06-18
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 2017-03-09
        • 2013-08-06
        • 2012-04-01
        相关资源
        最近更新 更多