Ecto - 验证相关模型的存在

Ker*_*ael 14 elixir ecto phoenix-framework

如何验证Ecto中相关模型的存在?

schema "foo" do
  has_many: bar, Bar

  timestamps
end

@required_fields ~w(bar) # invalid
Run Code Online (Sandbox Code Playgroud)

有办法吗?并验证这些字段的最小/最大数量?

Jos*_*lim 18

还没有任何东西.但您可以在changeset函数中自行运行这些验证:

def changeset(model, params) do
  model
  |> cast(...)
  |> validate_bar_association()
end

def validate_bar_association(changeset) do
  bar = changeset.model.bar
  cond do
    bar == nil ->
      add_error changeset, :bar, "No bar"
    length(bar) < 5 ->
      changeset
    true ->
      add_error changeset, :bar, "waaaay too many"
  end
end
Run Code Online (Sandbox Code Playgroud)

我们确实想要更好地嵌套关联,但我们的优先级列表中还有更高的其他项目.:)

  • 只是注意 - 在Ecto 2.0中,模型不再存在.请改用"changeset.data.bar". (2认同)