Poison Encode编码嵌套模型

时间:2015-10-17 17:02:32

标签: elixir phoenix-framework ecto

燮,

我试图编码一些嵌套的Ecto模型但我遇到了一个问题。我意识到我不能对卸载的模型进行编码,我希望有可能只选择一个结构而不需要加载休息,同时有可能选择整个树。

我使用了defimpl的方法,例如:

defimpl Poison.Encoder, for: Hangman.MasterCat do
    def encode(page, _options) do
      %{
        id: page.id,
        name: page.name,
        categories: page.categories
      } |> Poison.Encoder.encode([])
    end
  end
defimpl Poison.Encoder, for: Hangman.Category do
    def encode(category, _options) do
      IO.inspect(category.words)
      %{
        id: category.id,
        name: category.name,
        words: category.words
      } |> Poison.Encoder.encode([])
    end
  end
defimpl Poison.Encoder, for: Hangman.Word do
    def encode(page, _options) do
      %{
        content: page.content
      } |> Poison.Encoder.encode([])
    end
  end

这适用于整个结构,但它不适用于仅选择MasterCats并且它会产生这样的错误。

cannot encode association :categories from Hangman.MasterCat to JSON because the association was not loaded. Please make sure you have preloaded the association or remove it from the data to be encoded

1 个答案:

答案 0 :(得分:7)

您还需要为类别定义相同的编码器,依此类推。事实上,有一个更容易做到这一点,如果你使用最新的毒药,你可以写:

defmodule Hangman.MasterCat do
  use Ecto.Model

  @derive {Poison.Encoder, only: [:id, :name, :categories]}
  schema "..." do

这样,Elixir负责为您自动实施协议。只要你为你关心的类型派生编码器,你应该是好的。对于复杂的情况,正如您所做的那样,明确地实施协议是可行的方法。