1 min read

Ecto 验证 required 字段

Ecto 下的字段,可以简单分两类,一类是 model 本身所有,另一类是外键(foreign key),举个例子:

  schema "posts" do
    field :title, :string
    field :url, :string
    belongs_to :user, PhoenixNews.User

    timestamps()
  end

上面代码中,titleurlPost 模型自有的,但它还有一个外键 user_id,这是由 belongs_to 决定的。

而它们的验证必需(required)的方式,并不一样。

title 说,它的验证方法是这样的:

  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [:title, :url])
    |> validate_required(:title)
  end

为什么 user_id 不能只用 validate_required?因为用户可能传递一个数据库中没有的 user id,validate_required 只能验证它的值是否不为空,无法验证它的值是否存在数据库中。

所以,user_id 除了 validate_required 外,还要用 assoc_constraint 来验证:

  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [:title, :url, :user_id])
    |> validate_required(:user_id)
    |> assoc_constraint(:user)
  end 

或者,也可以用 foreign_key_constraint

报告问题 修订