Ecto changeset每次只验证一个关联

时间:2017-05-16 14:44:38

标签: validation elixir ecto

有人可以帮我理解变更集验证如何与关联一起使用,以便一次显示所有变更集关联错误吗?

我在下面创建了一些示例来解释。

请注意,如果Post具有无效的变更集,但其Comment/Like关联的变更集也应该无效,则结果变更集仅验证了Post属性:

Post.create_changeset(%Post{}, %{title: ""})
|> Ecto.Changeset.put_assoc(:comments, comments_changeset)
|> Ecto.Changeset.put_assoc(:likes, likes_changeset)
|> Repo.insert

#ecto.Changeset<action: :insert,
 changes: %{
   comments: [#ecto.Changeset<action: :insert, changes: %{text: nil}, errors: [], data: #Comment<>, valid?: true>],
   likes: [#ecto.Changeset<action: :insert, changes: %{up: nil}, errors: [], data: #Like<>, valid?: true>]
 },
 errors: [title: {"can't be blank", [validation: :required]}],
 data: #Post<>, valid?: false>

否则,当帖子符合标题并且有效时,现在结果更改集会显示相关Comment的错误,但不会显示错误。

Post.create_changeset(%Post{}, %{title: "now i have a title"})
|> Ecto.Changeset.put_assoc(:comments, comments_changeset)
|> Ecto.Changeset.put_assoc(:likes, likes_changeset)
|> Repo.insert

#ecto.Changeset<action: :insert,
 changes: %{
   comments: [#ecto.Changeset<action: :insert, changes: %{text: nil}, errors: [title: {"can't be blank", [validation: :required]}], data: #Comment<>, valid?: false>],
   likes: [#ecto.Changeset<action: :insert, changes: %{up: nil}, errors: [], data: #Like<>, valid?: true>]
 },
 errors: [], data: #Post<>, valid?: false>

它表现为某种&#34;懒惰的验证&#34;。这预计在Ecto中是这样的吗?

0 个答案:

没有答案