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

问题描述 投票:0回答:1

所以我想为一个Collection表实现一个查询函数,该表必须通过:id进行过滤,但也可以通过:rating和:accessibility进行过滤。该表必须通过 :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"?

elixir ecto
1个回答
3
投票

你可以简单地将参数原样传递给 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
© www.soinside.com 2019 - 2024. All rights reserved.