我在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
答案 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)