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

Tom*_*Tom 0 elixir ecto

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


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

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
Run Code Online (Sandbox Code Playgroud)

然后,可以使用以下方法将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
Run Code Online (Sandbox Code Playgroud)

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

如果Ecto中尚未提供此功能,那么从Ectos API的角度来看,添加此类功能并命名它们会很方便filter_trimfilter_...我猜呢?

zwi*_*pie 5

我认为最好在运行验证之前调整输入。同样,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])
Run Code Online (Sandbox Code Playgroud)

  • 我忽略了这样一个事实,即“update_change”仅在给定键发生更改时才执行给定函数。谢谢! (2认同)