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_trim
,filter_...
我猜呢?
我认为最好在运行验证之前调整输入。同样,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)