如何在 Ecto 毒物编码中排除嵌套模型



我有一个简单的模型(简短版本):

defmodule MyApp.User do
  use Ecto.Model
  @derive {Poison.Encoder, only: [:id, :name, :email]}
  schema "users" do
    field :name, :string
    field :email, :string
    belongs_to :company, MyApp.Company

我希望@derive在尝试对模型进行编码时排除:company关联,但似乎没有。使用Guardian序列化程序时会发生这种情况:

defmodule MyApp.GuardianSerializer do
  @behaviour Guardian.Serializer
  alias MyApp.Repo
  alias MyApp.User
  def for_token(user = %User{}), do: { :ok, "User:#{user.id}" }
  def for_token(_), do: { :error, "Unknown resource type" }
  def from_token("User:" <> id), do: { :ok, Repo.get(User, id) }
  def from_token(_), do: { :error, "Unknown resource type" }
end

我实际上不确定

会发生什么

def for_token(user = %User{}), do: { :ok, "User:#{user.id}" }

据我了解,user = %User{}正在尝试测试作为参数给出的对象是否是有效的User变更集对吗?

但是我反而收到此错误:

无法将关联:公司从 MyApp.User 编码为 JSON,因为 关联未加载。请确保您已预加载 关联或将其从要编码的数据中删除

不想预加载它,因为它需要更多的依赖项来编码,这也不起作用,我宁愿忽略它。

为什么@derive中的only参数不起作用,我该如何解决此问题?

我终于找到了问题所在。

我的项目中有一个与旧版本的 Ecto 相关的修复程序,您可以在此处找到有关此的讨论,以及我在此处使用的修复建议

所以,基本上我已经在其他地方重新定义了Poison.Encoder,对于所有事情(我知道,这样做很糟糕,而且像往常一样,这是暂时的......

defimpl Poison.Encoder, for: Any do
  def encode(%{__struct__: _} = struct, options) do
    map = struct
          |> Map.from_struct
          |> sanitize_map
    Poison.Encoder.Map.encode(map, options)
  end
  defp sanitize_map(map) do
    Map.drop(map, [:__meta__, :__struct__])
  end
end

通过删除它,使用最新版本的 ecto/poison/phoenix/you-name-it,它可以按预期工作。

非常感谢您的帮助@dogbert

最新更新