gpt4 book ai didi

elixir - 作为参数的 map 列表

转载 作者:行者123 更新时间:2023-12-02 02:44:22 26 4
gpt4 key购买 nike

我创建了一个如下所示的架构:

schema "countries" do

field :code, :string
field :en, :string
field :de, :string
field :it, :string
field :fr, :string

timestamps

end

现在我想创建接受 map 列表的变更集函数。我该如何定义它?这是对的吗(我想说这是错的):

defchangeset_all(model, []) do

那么如何验证传递的参数是否包含 map ?

第二个问题是,如何循环遍历 map 列表,然后获得所有传递值的变更集?我会这样做:

def changeset_all(model, [params]) do

for param <- [params] do
model
|> cast(param, [:code, :en, :de, :it, :fr])
|> validate_required([:code, :en])
|> validate_length(:code, max: 3)
|> unique_constraint(:code)
end
end

我希望我的问题很清楚。

最佳答案

def changeset_all(model, [params]) do只接受 1 个元素的列表。要接受任何列表,您可以执行以下操作:

def changeset_all(model, params) when is_list(params) do

要创建变更集列表,只需执行 for param <- params 。最终代码应如下所示:

def changeset_all(model, params) when is_list(params) do
for param <- params do
model
|> cast(param, [:code, :en, :de, :it, :fr])
|> validate_required([:code, :en])
|> validate_length(:code, max: 3)
|> unique_constraint(:code)
end
end

Then how can I validate if the passed parameter contains maps or not?

您实际上不需要这样做,就好像您传递了一个无效参数,cast将处理抛出错误。如果你想这样做,你可以循环列表并使用 if检查它是否是 map :

for param <- params
if !is_map(param) do
raise "#{param} is not a map"
end
end

for param <- params do
# changeset stuff
end
<小时/>

我建议创建一个 changeset/2单独运行,然后使用 Enum.map 调用它在changeset_all/2 :

def changeset(model, params) do
model
|> cast(params, [:code, :en, :de, :it, :fr])
|> validate_required([:code, :en])
|> validate_length(:code, max: 3)
|> unique_constraint(:code)
end

def changeset_all(model, list) do
list |> Enum.map(fn params -> changeset(model, params) end)
end

关于elixir - 作为参数的 map 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40254936/

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