1

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

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变更集,对吗?

但我得到了这个错误:

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

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

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

4

1 回答 1

0

我终于找到了问题所在。

我的项目中有一个与旧版本 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/ phoenixyou-name-it,它可以按预期工作。

非常感谢您的帮助@dogbert

于 2016-07-13T17:05:23.370 回答