【问题标题】:A list of maps as argument地图列表作为参数
【发布时间】:2016-10-26 14:20:38
【问题描述】:

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

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

我希望我的问题很清楚。

【问题讨论】:

    标签: elixir phoenix-framework ecto


    【解决方案1】:

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

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

    要创建变更集列表,只需执行for param &lt;- 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 函数,然后在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
    

    【讨论】:

    • 非常感谢,今晚我会尝试并告诉你。
    猜你喜欢
    • 2021-11-07
    • 2010-12-23
    • 2016-12-02
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 2014-04-14
    • 2018-07-25
    • 1970-01-01
    相关资源
    最近更新 更多