gpt4 book ai didi

elixir - 如何更新 Ecto Repo 结构的参数?

转载 作者:行者123 更新时间:2023-12-04 14:27:39 24 4
gpt4 key购买 nike

不确定我的术语是否正确,所以请更正。

它似乎过去就像传递一个带有更新参数的结构一样简单,这仍然是我找到的所有示例的记录方式,比如 Repo.update!(%{room |正文:“一个房间”})

但现在似乎需要一些键/主键参数以及一个变更集,我似乎无法将它按摩成它想要的格式,尝试像 Repo.update!(changeset, {id: 1}) 并出现如下错误:

** (FunctionClauseError) no function clause matching in Ecto.Repo.Schema.update/4
(ecto) lib/ecto/repo/schema.ex:216: Ecto.Repo.Schema.update(PingalServer.Repo, Ecto.Adapters.Postgres, #Ecto.Changeset<action: nil, changes: %{body: "A Room", name: "first"}, errors: [], data: #PingalServer.Room<>, valid?: true>, {:id, 1})
(ecto) lib/ecto/repo/schema.ex:135: Ecto.Repo.Schema.update!/4

变更集是这样的:

#Ecto.Changeset<action: nil,
changes: %{body: "A Room", name: "first"}, errors: [],
data: #PingalServer.Room<>, valid?: true>

我将不得不对变更集做更多的阅读,但似乎应该有一些例子说明新结构下的更新是什么样的?

谢谢!

最佳答案

传递给 Ecto.repo.update!/2 的第一个参数 必须 是一个变更集(即 Ecto.Changeset 结构)。见ecto documentation ,注意参数和返回值的类型定义。

%{房间 | body: "A Room"} 只给你一张 map ,而不是一个变更集。

但是,您可以转换一些参数到您从数据库中获取的模式以构建变更集。

room
|> Ecto.Changeset.cast(%{body: "A Room"}, [:body])
|> Repo.update!()

或者,如果您已经定义了 Room.changeset/2(例如,使用 mix phoenix.gen.model 生成模型),您还可以使用它来获取变更集

room
|> Room.changeset(%{body: "A Room"})
|> Repo.update!()

关于elixir - 如何更新 Ecto Repo 结构的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42265114/

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