在elixir中返回地图/字典的子集?

时间:2017-05-05 11:45:25

标签: dictionary elixir subset

我目前定义了以下方法:

def create_user(attrs \\ %{}) do
  %User{}
  |> user_registration_changeset(attrs)
  |> PaperTrail.insert()
end

此方法返回的值如下:

{
  :ok,
  %{
     model: %Udia.Accounts.User{...},
     version: %PaperTrail.Version{...}
   }
}

如何重写此链,只返回模型值?我想访问%App.Accounts.User{...}中的所有属性而无需进一步嵌套。

1 个答案:

答案 0 :(得分:2)

如果您希望在值不存在时返回nil,则可以输入Map.fetch!/2(或Map.get/2):

%User{}
|> user_registration_changeset(attrs)
|> PaperTrail.insert()
|> Map.fetch!(:model)

编辑:对于新代码,如果您只想使用管道,则可以执行以下操作:

%User{}
|> user_registration_changeset(attrs)
|> PaperTrail.insert()
|> elem(1)
|> Map.fetch!(:model)

但我还建议使用以下模式匹配解决方案,该解决方案还检查返回值的第一个元素是:ok而不是其他内容:

{:ok, %{model: model}} =
  %User{}
  |> user_registration_changeset(attrs)
  |> PaperTrail.insert()
model