Лучший способ сделать что-то, если на карте есть ключи в Elixir? - PullRequest
0 голосов
/ 30 апреля 2020

Итак, я пытаюсь реализовать функцию запроса для таблицы Collection. И эта таблица ДОЛЖНА быть отфильтрована по: 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}. И мне нужно сделать это в экто-запросах: [id: id], [id: id, rating: rating], et c ...

Я знаю, что могу сделать 4 разные функции, которые ожидают разные args, но это кажется очень многоразового использования. Может быть, кто-нибудь может дать мне лучший способ сделать компоновку «если у карты есть ключ a, то сделать это и ключ b, сделать это»?

1 Ответ

3 голосов
/ 30 апреля 2020

Вы можете просто передать аргумент как есть 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
...