地图列表作为参数

zero_coding

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

schema "countries" do

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

    timestamps

  end

现在,我想创建将接受地图列表的变更集函数。如何定义?这是对的(我会说这是错误的):

def changeset_all(model,[])做

然后,如何验证传递的参数是否包含地图?

第二个问题是,如何获得所有通过值的变更集之后,如何遍历地图列表?我会这样:

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

然后,如何验证传递的参数是否包含地图?

您实际上不需要这样做,就好像您传递了无效参数一样,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单独的功能,然后通过调用它Enum.mapchangeset_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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章