在将Ecto.Changeset
插入数据库之前调用changeset/2
时,Ecto中是否有内置方法可以删除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
函数中使用例如管道输入函数。
filter_trim
由于我认为这是一个常见的用例,我想知道是否有一个已经提供此功能的功能?
如果Ecto尚未提供此功能,那么从Ectos API的角度来看,添加此类功能并将其命名为filter_...
和-- All main categories:
select *
from mytable
where length(nr) - length(replace(nr,'.','')) = 0
order by nr;
我会猜测是否方便?
答案 0 :(得分: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])