9

すする、

ネストされた Ecto モデルをエンコードしようとしていますが、問題が発生しました。アンロードされたモデルをエンコードできないことに気付きました。残りをロードせずに1つの構造のみを選択する可能性があり、同時にツリー全体を選択する可能性が必要です。

メソッドを 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
4

1 に答える 1

7

カテゴリにも同じエンコーダーを定義する必要があります。実際、最新の Poison を使用している場合は、次のように書くことができます。

defmodule Hangman.MasterCat do
  use Ecto.Model

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

このように、Elixir は自動的にプロトコルを実装します。気になるタイプのエンコーダーを派生させる限り、うまくいくはずです。複雑なケースの場合は、プロトコルを明示的に実装することをお勧めします。

于 2015-10-20T10:38:02.603 に答える