Poison Encode 编码嵌套模型
Poison Encode encoding nested models
上,
我正在尝试对一些嵌套的 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
您也需要为类别等定义相同的编码器。其实还有一个更简单的方法,如果你用的是最新的Poison,你可以这样写:
defmodule Hangman.MasterCat do
use Ecto.Model
@derive {Poison.Encoder, only: [:id, :name, :categories]}
schema "..." do
这样,Elixir 会自动为您实施协议。只要你为你关心的类型派生编码器,你就应该很好。对于复杂的情况,像您所做的那样显式实现协议是可行的方法。
上,
我正在尝试对一些嵌套的 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
您也需要为类别等定义相同的编码器。其实还有一个更简单的方法,如果你用的是最新的Poison,你可以这样写:
defmodule Hangman.MasterCat do
use Ecto.Model
@derive {Poison.Encoder, only: [:id, :name, :categories]}
schema "..." do
这样,Elixir 会自动为您实施协议。只要你为你关心的类型派生编码器,你就应该很好。对于复杂的情况,像您所做的那样显式实现协议是可行的方法。