作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
不确定我的术语是否正确,所以请更正。
它似乎过去就像传递一个带有更新参数的结构一样简单,这仍然是我找到的所有示例的记录方式,比如 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/
我是一名优秀的程序员,十分优秀!