如果 map 在 Elixir 中有键,最好的方法是什么?

Best way to do something if map has keys in Elixir?

所以我正在尝试为集合 table 实现查询功能。 table 必须通过 :id 进行过滤,但也可以通过 :rating 和 :accessibility 进行过滤。

现在我有一个类似这样的函数:

def find_collection(args) do...

其中 args 可以是以下之一:%{id: id}%{id: id, rating: rating}%{id: id, accessibility: accessibility}%{id: id, rating: rating, accessibility: accessibility}。我需要将这些放入 ecto 查询中:[id: id][id: id, rating: rating] 等...

我知道我可以制作 4 个不同的功能,期望不同 args,但这似乎非常不可重用。也许有人可以给我一个更好的组合方式 "if map has key a do this and key b do this"?

您可以简单地将参数原样传递给 Ecto.Query.where/3。最安全的方法有点像:

def find_collection(%{id: _} = args) do
  where_clause =
    args
    |> Map.take(~w|id rating accessibility|a)
    |> Map.to_list()
  from(t in Table, where: ^where_clause)
end