Ecto Changeset,未对更改进行验证的必填字段

时间:2017-01-01 03:16:47

标签: elixir ecto changeset

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

我有一个“域模型”结构,它包含一些必填字段。当我执行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

1 个答案:

答案 0 :(得分:2)

$section->getAllChildren()->pluck('id'); 没有执行验证,您需要通过put_change传递更新的变更集,因此它会尝试对您更新的状态执行验证。

希望能稍微澄清一下这个问题!

修改

只是为了澄清:

validate_required