在 phoenix 应用程序中,当用户提交特定表单时,会根据地址计算 lat 和 lng。
如果未进行任何更改,纬度和经度可以位于changeset.data中,如果提交更改,则可以位于changeset.changes中。
我在变更集上对纬度和经度执行其他操作,但我需要知道坐标在哪里。我想做的是:
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)右侧值不匹配:%{lat:any_value}
我实际上做了一个很长的看起来不太好的 if else if .... 语句来实现这一点。
有没有更好的 Elixir 方法可以做到这一点?
最佳答案
您可以使用case
来匹配changes
或data<内的
:lat
和lng
/
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 - 条件和模式与 map 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45772187/