首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更新Ecto结构的参数?

如何更新Ecto结构的参数?
EN

Stack Overflow用户
提问于 2017-02-16 04:40:24
回答 1查看 4.3K关注 0票数 3

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

看起来它过去就像传递带有更新参数的结构一样简单,这仍然是我找到的所有示例都被记录下来的方式,比如Repo.update!(%{room | body: "A Room"})

但是现在似乎需要一些键/主键参数以及一个更改集,我只是不能将它按它想要的格式进行修改,尝试类似于Repo.update!(changeset, {id: 1})之类的东西,并得到如下错误:

代码语言:javascript
复制
** (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

其中的变更集类似于:

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

我需要对变更集做更多的解读,但似乎应该有一些例子说明在新结构下更新是什么样子的?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2017-02-16 08:02:13

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

%{room | body: "A Room"}只给你一张地图,而不是一个变更集。

但是,您可以将一些参数转换到从数据库获取的架构上,以构建更改集。

代码语言:javascript
复制
room
|> Ecto.Changeset.cast(%{body: "A Room"}, [:body])
|> Repo.update!()

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

代码语言:javascript
复制
room
|> Room.changeset(%{body: "A Room"})
|> Repo.update!()
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42265114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档