在更改集属性进入数据库之前对其进行转换

时间:2018-10-22 18:39:06

标签: elixir phoenix-framework ecto

我在Elixir表单中添加了textarea,并将值设置为string,并将该字符串输入到jsonb类型的数据库元数据列中。我希望将textarea中的字符串用换行符分隔并存储array的{​​{1}},而不是一个大字符串。

此后,我如下更改了类型。

strings

但是,我不确定如何使用Ecto截取这些数据并在进入数据库之前将其拆分。

我看过:

似乎我可以在架构中添加一个field :names, {:array, :string} 函数,这是我的尝试。

validation

如何更改Elixir对象中一个属性的值?

更新:

  

person_metadata.ex

def changeset(schema, params \\ %{}) do
    schema
    |> cast(params, @required, @optional)
    |> validate_name()
end

defp validate_names(changeset) do
    # fetch_field(changeset, :names)
    # Map.put(changeset, :names, String.split(:names, "\r\n"))
end

2 个答案:

答案 0 :(得分:2)

尝试一下:

defp validate_names(changeset) do
  case get_field(changeset, :names) do
    # Don't do anything if names don't exist
    nil ->
      changeset

    # Update names if they do exist
    names ->
      new_names = String.split(names, "\r\n")
      put_change(changeset, :names, new_names)
  end
end

答案 1 :(得分:0)

似乎整个自定义函数现在(自何时起)可以用Ecto.Changeset.update_change/3代替

 |> update_change(:names, fn
     nil -> nil # or preferably []?
     names -> String.split(names, ~r{\r?\n})
    end)

或作为样式问题

 |> update_change(:names, &my_name_splitter/1)