Как использовать переменные в в запросе Ecto в предложении where - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть карта:

  allowed_lookup = %{coordinate: "15.0", id: 1}

Я хочу использовать эту карту, чтобы сделать запрос Ecto для фильтрации некоторых записей в базе данных.

Я думаю что-то вроде этого:

Enum.reduce(allowed_lookup, Project.Models.Grid,
            fn {x,y}, query ->
                IO.puts "#{inspect x} , #{inspect y}"
                query = where(query, [q] , q.x == ^y)
            end)

queryset = Project.Repo.all(query)

Таким образом, он будет рекурсивно применять все фильтры, присутствующие на карте, чтобы получить набор запросов.Но этот код недействителен, так как qx не конвертируется в q.coordinate или q.id.

1 Ответ

0 голосов
/ 30 сентября 2018

Попробуйте это

allowed_lookup = %{coordinate: "15.0", id: 1}
Enum.reduce(allowed_lookup, Project.Models.Grid,
        fn {x,y}, query ->
            IO.puts "#{inspect x} , #{inspect y}"

            field_query = [{x, y}] #dynamic keyword list

            query|>where(^field_query)
        end)

queryset = Project.Repo.all(query)

Ecto.Query.where принимает список ключевых слов, в котором поле, заданное в качестве ключа, будет сравниваться с заданным значением.В этом случае использование простой конструкции [key: value] для списка ключевых слов не будет работать, поскольку поле и значение являются динамическими.Тем не менее, список ключевых слов также может быть построен динамически, как список кортежей, как [{key, value}].

 iex> [{:a, 1}] == [a: 1] # true
...