gpt4 book ai didi

elixir - 如何使用 Ecto 的 has_many 和 cast_assoc

转载 作者:行者123 更新时间:2023-12-01 04:52:55 25 4
gpt4 key购买 nike

我是 Elixir 和 Ecto 的新手,我需要一些有关 Ecto 的 has_many 和 cast_assoc 的帮助。无法理解基础知识,例如我如何使用关联模型创建新模型。

这是我的 Has_Model:

defmodule Example.Has_Model do
use Ecto.Schema
import Ecto.Changeset
alias Example.Repo
alias Example.Has_Model

schema "has_models" do
has_many :belong_models, Example.Belong_Model
field :name, string
timestamps
end

def changeset(has_model, params \\ %{}) do
has_model
|> cast(params, [:name])
end
end

这是 Belong_Model:
defmodule Example.Belong_Model do
use Ecto.Schema
import Ecto.Changeset
alias Example.Repo
alias Example.Belong_Model

schema "belong_models" do
belongs_to :has_model, Example.Has_Model
field :name, string
timestamps
end

def changeset(belong_model, params \\ %{}) do
belong_model
|> cast(params, [:name])
|> cast_assoc(:has_model, required: true)
end
end

现在,我尝试做的是首先创建一个 Has_Model
iex()> changeset = Example.Has_Model.changeset(%Has_Model, %{name: "I have"})
iex()> Example.Repo.insert(changeset)

这工作还行。

然后我想创建一个新的 Belong_Model 并使用之前创建的 Has_Model:
iex()> has = Example.Has_Model |> Example.Repo.get_by(name: "I have")
iex()> changeset = Example.Belong_Model.changeset(%Belong_Model, %{name: "I belong", belongs_to: has})

这就是失败的地方:
** (Ecto.CastError) expected params to be a map, got: `%Example.Has_Model{__meta__: #Ecto.Schema.Metadata<:loaded, "has_models">, id: 1, inserted_at: #Ecto.DateTime<2016-10-04 19:39:38>, name: "I have", updated_at: #Ecto.DateTime<2016-10-04 19:39:38>, belong_models: #Ecto.Association.NotLoaded<association :belong_models is not loaded>}`
(ecto) lib/ecto/changeset.ex:345: Ecto.Changeset.do_cast/4
(example) lib/example/models/has_model.ex:15: Example.Has_Model.changeset/2
(ecto) lib/ecto/changeset/relation.ex:99: Ecto.Changeset.Relation.do_cast/5
(ecto) lib/ecto/changeset/relation.ex:235: Ecto.Changeset.Relation.single_change/5
(ecto) lib/ecto/changeset.ex:571: Ecto.Changeset.cast_relation/4
(example) lib/example/models/belong_model.ex:16: Example.Belong_Model.changeset/2

发生了什么,解决方案是什么?我一整天都试图改变这些参数,但我就是不明白。

最佳答案

我想你要找的是build_assoc/3

iex()> has = Example.Has_Model |> Example.Repo.get_by(name: "I have")
iex()> belong_assoc = Ecto.build_assoc(has, :belong_models, has_model_id: has.id, name: "I belong")
iex()> Repo.insert!(belong_assoc)

cast_assoc/3应该像这样使用:
iex()> changeset = Example.Belong_Model.changeset(%Belong_Model, %{name: "I belong", has_model: %{name: "I have"})
iex()> Repo.insert!(changeset)

笔记:

The parameters for the given association will be retrieved from changeset.params and the changeset function in the association module will be invoked

关于elixir - 如何使用 Ecto 的 has_many 和 cast_assoc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39861376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com