gpt4 book ai didi

elixir - 三分之一需要validate_required

转载 作者:行者123 更新时间:2023-12-04 02:02:21 24 4
gpt4 key购买 nike

我有 Xyz其中有一个 country_id , federal_state_idcity_id .但只有其中一个(不是全部三个,也不是两个)。我怎样才能对此进行验证?另外我该怎么做 assoc_constraint/1只针对那个领域?

defmodule Example.Location.Xyz do
use Ecto.Schema
import Ecto.Changeset
alias Example.Location.Xyz

schema "xyzs" do
field :name, :string
belongs_to :country, Example.Location.Country
belongs_to :federal_state, Example.Location.FederalState
belongs_to :city, Example.Location.City

timestamps()
end

@doc false
def changeset(%Xyz{} = xyz, attrs) do
school
|> cast(attrs, [:name, :country_id, :federal_state_id, :city_id])
|> validate_required([:name, :country_id, :federal_state_id, :city_id])
|> assoc_constraint(:country)
|> assoc_constraint(:federal_state)
|> assoc_constraint(:city)
end
end

最佳答案

我将创建一个函数来检查 3 个字段中的 1 个是否存在,并添加正确的 assoc_constraint :

@doc false
def changeset(%Xyz{} = xyz, attrs) do
school
|> cast(attrs, [:name, :country_id, :federal_state_id, :city_id])
|> validate_required([:name])
|> validate_one_of_present([:country_id, :federal_state_id, :city_id])
end

def validate_one_of_present(changeset, fields) do
fields
|> Enum.filter(fn field ->
# Checks if a field is "present".
# The logic is copied from `validate_required` in Ecto.
case get_field(changeset, field) do
nil -> false
binary when is_binary(binary) -> String.trim_leading(binary) == ""
_ -> true
end
end)
|> case do
# Exactly one field was present.
[field] ->
without_id = field |> Atom.to_string |> String.replace_suffix("_id", "") |> String.to_existing_atom
assoc_constraint(changeset, without_id)
# Zero or more than one fields were present.
_ ->
add_error(changeset, hd(fields), "expected exactly one of #{inspect(fields)} to be present")
end
end

代码未经测试,如果您发现任何错误,请告诉我!

关于elixir - 三分之一需要validate_required,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46330499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com