如果 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
所以我正在尝试为集合 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