elixir - 条件和模式与 map 匹配

标签 elixir phoenix-framework

在 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

当然,这不起作用,因为它在模式不匹配时不会返回 truefalse

**(MatchError)右侧值不匹配:%{lat:any_value}

我实际上做了一个很长的看起来不太好的 if else if .... 语句来实现这一点。

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

最佳答案

您可以使用case来匹配changesdata<内的latlng/:

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/

相关文章:

elixir - 无法通过监护人获取当前用户

elixir 常量化一个字符串来获取模块(String.to_module/1)?

elixir - 未为 [token : "12345"] 实现协议(protocol) Phoenix.Param

elixir - 如何为 phoenix 框架项目加载环境变量

elixir - 如何将匿名函数传递到 Elixir 中的管道

elixir - Windows - Elixir 'mix' 在 iex 解释器中未定义

elixir - 如何将命令行参数传递给 mix run --no-halt

elixir - 如何在 Ecto 模型中定义虚拟属性

elixir - 使 Phoenix Controller 输出漂亮的 JSON

datetime - 在Ecto.DateTime和DateTime之间转换