使用 Ecto 变更集删除尾随和前导空格

Remove trailing and leading whitespaces with Ecto changeset

在将 changeset/2 插入数据库之前调用 changeset/2 时,Ecto 是否有内置方法删除 Ecto.Changeset 中字段的尾随和前导空格?


目前,我正在向我的模式添加两个自定义函数以进行数据过滤以提高数据完整性:

defp trim_fields(changeset, fields) do
  Enum.reduce(fields, changeset, &trim(&2, &1))
end

defp trim(changeset, field) do
  if get_change(changeset, field) do
    update_change(changeset, field, &String.trim/1)
  else
    changeset
  end
end

然后可以在 changeset/2 函数中使用管道传输函数,例如

def changeset(%Customer{} = customer, attrs) do
  |> cast(attrs, [:first_name, :last_name])
  |> validate_required([:first_name], [:last_name])
  |> trim_fields([:first_name, :last_name])
end

因为我认为这是一个常见的用例,所以我想知道是否没有一个函数已经提供了这个功能?

如果 Ecto 还没有提供这个功能,那么从 Ectos API 的角度来看,添加这样的功能并命名为 filter_trim 和 [=16= 会很方便] 我猜?

我认为最好在 运行 验证之前 trim 输入。此外,update_change 只会在给定密钥发生更改时执行更改。

这导致代码更加精简:

changeset
|> cast(attrs, [:first_name, :last_name])
|> update_change(:first_name, &String.trim/1)
|> update_change(:last_name, &String.trim/1)
|> validate_required([:first_name, :last_name])