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
我生成了两个模型 Prefecture
和 Shop
。
Shop
属于 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)
谢谢。
我生成了两个模型 Prefecture
和 Shop
。
Shop
属于 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)
谢谢。