key :xxx not found in: #Ecto.Association.NotLoaded<association :xxx is not loaded> in Phoenix Framework

key :xxx not found in: #Ecto.Association.NotLoaded<association :xxx is not loaded> in Phoenix Framework

我生成了两个模型 PrefectureShopShop 属于 Prefecture.

我遇到错误

key :prefecture_name not found in:

Ecto.Association.NotLoaded

我写了下面的代码。

Prefecture.ex

defmodule Sample.Prefecture do
  use Ecto.Schema
  import Ecto.Changeset

  schema "prefectures" do
    field :prefecture_name, :string

    has_many :shop, Sample.Shop

    timestamps()
  end

  @doc false
  def changeset(prefecture, attrs) do
    prefecture
    |> cast(attrs, [:prefecture_name])
    |> validate_required([:prefecture_name])
  end
end

Shop.ex

defmodule Sample.Shop do
  use Ecto.Schema
  import Ecto.Changeset

  schema "shops" do
    field :address, :string
    field :phone_no, :string
    field :store_name, :string
    belongs_to :prefecture, Sample.Prefecture

    timestamps()
  end

  @doc false
  def changeset(shop, attrs) do
    shop
    |> cast(attrs, [:store_name, :address, :phone_no, :prefecture_id])
    |> validate_required([:store_name, :address, :phone_no])
  end
end

好像还行。但是错误发生了。

key :prefecture_name not found in: #Ecto.Association.NotLoaded<association :prefecture is not loaded>

我想做的是得到prefecture_name.

此代码需要什么?

在能够访问关系之前,您必须 preload 它们。发生这种情况是因为当您从数据库中获取特定模式时,不会提取嵌套关系,您必须明确地这样做。

在你的情况下,假设你有值 shop 表示来自你的数据库的记录:

shop_preloaded = shop
|> Repo.preload(:prefecture_name)

在这种情况下,我应该写如下。

   Repo.all(Shop) |> Repo.preload(:prefecture)

谢谢。