phoenix_ecto:加载assoc时出错

时间:2015-08-12 13:04:24

标签: elixir phoenix-framework ecto

使用以下混合代表:

[{:phoenix, "~> 0.15"},
 {:phoenix_ecto, "~> 1.0.0"},
 {:postgrex, ">= 0.0.0"},
 {:phoenix_html, "~> 2.1"},
 {:phoenix_live_reload, "~> 0.5", only: :dev},
 {:cowboy, "~> 1.0"}]

以下型号:

# foo.ex
has_many: :bars, App.Bar

# bar.ex
belongs_to: :foo, App.Foo

在尝试预加载bars时,如果已在数据库中插入Foo,则会出错:

Repo.all(Foo) |> Repo.preload(:bars)

产量:

** (FunctionClauseError) no function clause matching in Postgrex.Extensions.Binary.encode/4
    (ecto) lib/ecto/repo/preloader.ex:49: Ecto.Repo.Preloader.do_preload/4

如果尚未插入[],则不会产生错误(仅Foo)。

Bar迁移:

defmodule App.Repo.Migrations.CreateBar do
  use Ecto.Migration

  def change do
    create table(:bars) do
      add :title, :string
      add :foo_id

      timestamps
    end

    create index(:bars, [:foo_id])
  end
end

1 个答案:

答案 0 :(得分:3)

您在迁移中缺少:foo_id的类型。

尝试以下方法:

defmodule App.Repo.Migrations.CreateBar do
  use Ecto.Migration

  def change do
    create table(:bars) do
      add :title, :string
      add :foo_id, references(:foos)

      timestamps
    end

    create index(:bars, [:foo_id])
  end
end

您可以在http://hexdocs.pm/ecto/0.15.0/Ecto.Migration.html

阅读有关迁移的文档