所以我想为一个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"?
你可以简单地将参数原样传递给 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