Ecto Changeset,必填字段未验证更改

Ecto Changeset, required fields not validating on changes

正在学习 Elixir/Ecto,并且遇到了与变更集相关的障碍。不确定我做错了什么。

我有一个 "domain model" 结构,其中包含一些必填字段。当我执行 put_change 时,返回的变更集仍然说变更集有错误(字段丢失),即使它就在变更中。

cset = Activity.changeset(%Activity{}, %{details: "Played in the snow", child_id: child_id}) 

#Ecto.Changeset<action: nil,
 changes: %{child_id: "ed553c30-38d2-4cb1-9029-eb2180c141cc",
   details: "Played in the snow"},
 errors: [relevant_date: {"can't be blank", [validation: :required]},
  display_time: {"can't be blank", [validation: :required]}],
 data: #MyApp.Domain.Activity<>, valid?: false> 

以上是意料之中的事情。 relevant_datedisplay_time 都丢失了,因此错误应该在那里。

cset |> Ecto.Changeset.put_change(:relevant_date, ~D[2016-12-31])

#Ecto.Changeset<action: nil,
 changes: %{child_id: "ed553c30-38d2-4cb1-9029-eb2180c141cc",
   details: "Played in the snow", relevant_date: ~D[2016-12-31]},
 errors: [relevant_date: {"can't be blank", [validation: :required]},
  display_time: {"can't be blank", [validation: :required]}],
 data: #Kidgenius.Domain.Activity<>, valid?: false>

这部分对我来说没有任何意义。 relevant_date 就在 的更改字段中,但它仍然告诉我 relevant_date can't be blank.

如有任何帮助,我们将不胜感激!

编辑: 这是 Ecto 2.1.1

put_change 不执行验证,您需要通过 validate_required 传递更新的变更集,因此它将尝试对您的更新状态执行验证。

希望能稍微澄清问题!

编辑

澄清一下:

# 1.
cset =
  Activity.changeset(
    %Activity{},
    %{details: "Played in the snow", child_id: child_id}
  )

# 2.
cset = Ecto.Changeset.put_change(cset, :relevant_date, ~D[2016-12-31])

# 3. This probably is something you currently have implemented
#    in your `Activity.changeset`, most likely as second setep
#    after `Ecto.cast/3`.
cset = Ecto.Changeset.validate_required(cset, [:relevant_date])