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

时间:2017-02-16 04:40:25

标签: elixir phoenix-framework ecto

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

似乎过去就像传入带有更新参数的结构一样简单,这仍然是我发现的所有示例的记录,例如Repo.update!(%{room | body: "A 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>

我将不得不对变更集做更多的阅读,但似乎应该有一些新结构下的更新内容的例子?

谢谢!

1 个答案:

答案 0 :(得分:2)

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

%{room | body: "A Room"}只为您提供地图,而不是变更集。

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

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!()