как написать это где пункт в Экто - PullRequest
0 голосов
/ 15 июня 2019

Мне нужно отфильтровать индекс, который может принимать в некоторых случаях значения, разделенные запятыми.Я работаю с Ecto, без Phoenix (с ковбоем).

мой индекс будет поддерживать такой поиск, как этот

/users?ids=1,2,3&email=simple@email.com&another=something

, где в поле электронной почты не допускается более одного параметра, а идентификаторы поддерживают болеечем 1 id

Это то, что я пробовал

def list_all(query_params) do
    filtered_params = prepare_list_query(query_params)

    User
    |> where(^filtered_params)
    |> Repo.all()
  end

  # In order to simplify queries I decided to manage all queries as IN clause
  # it will returns [id: [1,2,3], email:["something@mymail.com"]]

  defp prepare_list_query(query_params) do
    query_params
    |> Map.take(~w(ids email another))
    # Careful: read reference #1 above
    |> Enum.map(fn {name, value} ->
      case name do
        "ids" -> {:id, String.split(value, ",")}
        single_param -> {String.to_atom(single_param), [value]}
      end
    end)
  end

Это сложно, но моя идея состоит в том, чтобы вернуть

[id: [1,2,3], email:["something@mymail.com"]]

, а затем работать все фильтры как предложение IN.

Этот фильтр должен поддерживать отправку нуля, одного или всех параметров.

Я новичок в мире эликсира и делаю свои первые шаги.

Заранее спасибо:).

1 Ответ

2 голосов
/ 16 июня 2019

Вы можете использовать Enum.reduce/3 для динамического построения экто-запроса на основе параметров

def list_all(query_params) do
    query = User # initial query

    query_params
    |> Map.take(~w(ids email another))
    |> Enum.reduce(query, fn 
      {_key, value} when value in [nil, ""], q ->
          q # ignore empty values          
      {"ids", value}, q -> 
          ids = String.split(values, ",")
          q |> where([r], r.id in ^ids) 
      {key, value} ->
          args = [{key, value}] 
          q |> where(^args)
      end
    end)
    |> Repo.all()
  end

В функции сокращения вы можете добавлять новые предложения для обработки различных ключей и значений.

...