gpt4 book ai didi

functional-programming - Ecto Changeset 添加警告功能

转载 作者:行者123 更新时间:2023-12-04 16:05:36 44 4
gpt4 key购买 nike

我创建了 ecto 的分支要扩展的存储库Ecto.Changeset能够向变更集添加警告的模块。我想要一个 add_warnings/4将警告添加到变更集中的函数,作为具有此结构的简单警告列表 warnings: [{atom, {String.t, Keyword.t}}] , 类似于 errors . warnings 的行为之间的区别和 errors就是当错误发生时数据不会被持久化,但是当警告发生时数据会被持久化。
Ecto.Changeset使用键扩展的结构 warningswarningless? :

defstruct valid?: false, warningless?: false, data: nil, params: nil, changes: %{}, repo: nil,
errors: [], warnings: [], validations: [], required: [], prepare: [],
constraints: [], filters: %{}, action: nil, types: nil,
empty_values: @empty_values

调整了类型转换、改变、加工参数等的Ecto功能。功能 add_warnings/4添加:
@spec add_warning(t, atom, String.t, Keyword.t) :: t
def add_warning(%{warnings: warnings} = changeset, key, message, keys \\ []) when is_binary(message) do
%{changeset | warnings: [{key, {message, keys}}|warnings], warningless?: false}
end

结果是我收到 changeset使用预期的键:
#Ecto.Changeset<action: nil, changes: %{}, data: #Company.Booking<>, errors: [],
valid?: true, warnings: [], warningless?: true>

当我使用错误和警告进行更改时,我收到:
#Ecto.Changeset<action: nil,
changes: %{pickup_address: #Ecto.Changeset<action: :update,
changes: %{street_name: nil}, data: #Company.Address<>,
errors: [street_name: {"can't be blank", [validation: :required]}],
valid?: false,
warnings: [phone_number: {"This phone number is not common in Netherlands",
[]}], warningless?: false>}, data: #Company.Booking<>, errors: [],
valid?: false, warnings: [], warningless?: true>

因此,就警告而言,一切都按预期进行。然后,当我使用警告但没有错误进行更改时,我会收到:
#Ecto.Changeset<action: nil,
changes: %{pickup_address: #Ecto.Changeset<action: :update,
changes: %{street_name: "sss"}, data: #Company.Address<>, errors: [],
valid?: true,
warnings: [phone_number: {"This phone number is not common in Netherlands",
[]}], warningless?: false>}, data: #Company.Booking<>, errors: [],
valid?: true, warnings: [], warningless?: true>

一切都如预期的那样。当我不对表格进行任何更改时,我仍然应该收到电话号码警告,但我收到:
#Ecto.Changeset<action: nil, changes: %{}, data: #Company.Booking<>,    errors: [],
valid?: true, warnings: [], warningless?: true>

我得到了一个没有任何警告的变更集,因为没有 changes键入变更集,因为数据没有改变。

问题如下,如何实现警告功能以在变更集中始终有警告,即使没有进行任何更改?

最佳答案

您应该考虑在每个 changeset 的开头预先填写警告。您将创建的函数 - 因为您不能使用 plug在那里你可以写一个宏来为你处理这个逻辑,__using__建议,因此很容易将您的逻辑与 Ecto 的默认逻辑区分开来。

您的验证不应该向警告列表添加警告,但您必须以另一种方式实现它 - 如果该字段很好,您将从该列表中删除已经存在的警告。这样你就可以确定你的变更集在 warningless 时没有问题。 ,因为它从该列表中删除了所有警告,并且它非常适用于变更集中的空更改。

关于functional-programming - Ecto Changeset 添加警告功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44717965/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com