Эликсир Экто, где Query Throwing `Протокол не реализован Ошибка` - PullRequest
0 голосов
/ 11 октября 2018

У меня есть то, что я считаю относительно простым Ecto-запросом в Elixir, и он выдает ошибку «протокол не реализован для», и я очень озадачен, почему.

Итак, вот запрос:

    head_children_list =    Comments
                                |> where([c], c.inserted_at in ^head_children) 
                                |> Enum.sort_by(& &1["votetotal"])

Итак, head_children - это список с одной строковой меткой времени.Это подтвержденный вывод терминала:

value of head_children
["2018-10-11 14:08:15.021033"]

Так что я точно знаю , что это список.Однако когда я пытаюсь выполнить вышеуказанный запрос, я получаю следующее:

[info] Sent 500 in 168ms
[error] #PID<0.401.0> running AlbatrossWeb.Endpoint (cowboy_protocol) terminated
Server: localhost:4000 (http)
Request: POST /voteComment
** (exit) an exception was raised:
    ** (Protocol.UndefinedError) protocol Enumerable not implemented for #Ecto.Query<from c in Albatross.Comments, where: c.inserted_at in ^[["2018-10-11 14:08:15.021033"]]>. This protocol is implemented for: DBConnection.PrepareStream, DBConnection.Stream, Date.Range, Ecto.Adapters.SQL.Stream, File.Stream, Function, GenEvent.Stream, HashDict, HashSet, IO.Stream, List, Map, MapSet, Postgrex.Stream, Range, Stream

Обратите внимание, что это говорит о том, что протокол реализован для списков .Но это список!Поэтому я очень смущен.Я попытался использовать ^[head_children], который просто помещает его в другой список, но это также не удается с той же ошибкой.

Кто-нибудь знает, что происходит?

1 Ответ

0 голосов
/ 11 октября 2018

where(Comments, [c], c.inserted_at in ^head_children) возвращает %Ecto.Query{}, который передается в Enum.sort_by/2.%Ecto.Query{} это структура, а не список, который не является Enumerable.

Возможно, вы хотите

head_children_list =
  Comments
  |> where([c], c.inserted_at in ^head_children)
  |> Repo.all()
  |> Enum.sort_by(& &1["votetotal"])
...