在 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

当然,这不起作用,因为它不会在模式不匹配时返回 truefalse
** (MatchError) no match of right hand side value: %{lat: any_value}
我实际上做了一个很长的不好看 if else if .... 声明来实现这一点。

有没有更好的 Elixir 方法来做到这一点?

最佳答案

您可以使用 case 来匹配 latlng 中的 changesdata :

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/

10-10 17:19