作为参数的地图列表
A list of maps as argument
我创建了一个如下所示的架构:
schema "countries" do
field :code, :string
field :en, :string
field :de, :string
field :it, :string
field :fr, :string
timestamps
end
现在我想创建接受地图列表的变更集函数。我该如何定义它?这样对吗(我会说是错的):
def changeset_all(模型, []) 做
那么如何验证传递的参数是否包含地图?
第二个问题是,我如何循环遍历地图列表,然后获得所有传递值的变更集?我会这样做:
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
检查它是否是一个地图:
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
函数,然后在 changeset_all/2
中使用 Enum.map
调用它:
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
我创建了一个如下所示的架构:
schema "countries" do
field :code, :string
field :en, :string
field :de, :string
field :it, :string
field :fr, :string
timestamps
end
现在我想创建接受地图列表的变更集函数。我该如何定义它?这样对吗(我会说是错的):
def changeset_all(模型, []) 做
那么如何验证传递的参数是否包含地图?
第二个问题是,我如何循环遍历地图列表,然后获得所有传递值的变更集?我会这样做:
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
检查它是否是一个地图:
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
函数,然后在 changeset_all/2
中使用 Enum.map
调用它:
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