燮,
我试图编码一些嵌套的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
答案 0 :(得分:7)
您还需要为类别定义相同的编码器,依此类推。事实上,有一个更容易做到这一点,如果你使用最新的毒药,你可以写:
defmodule Hangman.MasterCat do
use Ecto.Model
@derive {Poison.Encoder, only: [:id, :name, :categories]}
schema "..." do
这样,Elixir负责为您自动实施协议。只要你为你关心的类型派生编码器,你应该是好的。对于复杂的情况,正如您所做的那样,明确地实施协议是可行的方法。