在 phoenix 应用中,当用户提交特定表单时,lat 和 lng 是根据地址计算的。
如果没有进行任何更改,则 lat 和 lng 可以在 changeset.data 中,如果提交更改,则可以在 changeset.changes 中。
我在变更集上的 lat 和 lng 上执行其他操作,但我需要知道坐标在哪里。我想要做的是:
cond do
# Always use new coordinates if possible
%{lat: lat, lng: lng} = changeset.changes ->
do_something(lat, lng)
%{lat: lat, lng: lng} = changeset.data ->
do_something(lat, lng)
true ->
do_nothing_and_return_the_changeset_as_is
end
当然,这不起作用,因为它不会在模式不匹配时返回
true
或 false
。** (MatchError) no match of right hand side value: %{lat: any_value}
我实际上做了一个很长的不好看 if else if .... 声明来实现这一点。
有没有更好的 Elixir 方法来做到这一点?
最佳答案
您可以使用 case
来匹配 lat
或 lng
中的 changes
和 data
:
case changeset do
%{changes: %{lat: lat, lng: lng}} -> ...
%{data: %{lat: lat, lng: lng}} -> ...
_ -> ...
end
但是,有一个更好的方法:Ecto 有一个
get_field
函数,它处理从 changes
获取字段值,自动回退到 data
。lat = get_field(changeset, :lat)
lng = get_field(changeset, :lng)
if lat && lng do
...
else
...
end
关于elixir - 条件和模式匹配映射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45772187/