Ben*_*tes 10 elixir ecto phoenix-framework
我有一个带有这个(简化)模式的地址的ecto模型:
defmodule Address do
use Ecto.Model
schema "addresses" do
field :zip, :string
field :country, :string
# snip
end
@countries_requiring_zip ~w(US) # snip
def changeset(model, params \\ :empty) do
model
|> cast(params, ~w(country), ~w(zip))
|> validate_zip
end
defp validate_zip(changeset) do
if get_field(changeset, :country) in @countries_requiring_zip do
# ????
end
changeset
end
end
Run Code Online (Sandbox Code Playgroud)
我想标记zip
为必需而不是可选,但仅当国家/地区是白名单时,但我无法找到一种干净的方式来编写验证.如何添加该约束?
Jos*_*lim 13
您也可以简单地定义多个强制转换:
def changeset(model, params \\ :empty) do
model
|> cast(params, ~w(country), ~w())
|> cast_by_country(params)
end
defp cast_by_country(changeset, params) do
case get_field(changeset, :country) do
"US" -> cast(changeset, params, ~w(zip), ~w())
_ -> cast(changeset, params, ~w(), ~w(zip))
end
end
Run Code Online (Sandbox Code Playgroud)
get_field/2
如果没有,则会从更改中读取值并回退到struct 1.这是变更集的最大好处:它只是数据结构,您可以使用常规Elixir代码进行条件检查,验证等.直接写入,读取和测试.:)