在Phoenix框架中的#Ecto.Association.NotLoaded <关联:xxx未加载>中找不到密钥:xxx

时间:2019-12-03 07:55:35

标签: elixir phoenix-framework

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

我收到错误

  

键:在以下位置找不到地名:

     

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>

我想做的就是获取地名。

该代码需要什么?

2 个答案:

答案 0 :(得分:0)

在访问关系之前,您必须先preload。发生这种情况的原因是,当您从数据库中获取特定的架构时,嵌套关系不会被拉出,您必须显式地这样做。

在您的情况下,假设您有shop值,女巫代表您数据库中的一条记录:

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

答案 1 :(得分:0)

在这种情况下,我应该写以下内容。

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

谢谢。