Ошибка компиляции с Ecto и Phoenix и Enumerable

у меня есть этот код

defmodule Project.Search do
use Ecto.Model

defp search(query, search, order?) do
  name_search = like_escape(search, ~r"(%|_)")
  if String.length(search) >= 3 do
     name_search = "%" <> name_search <> "%"
  end

  desc_search = String.replace(search, ~r"\s+", " & ")

  query =
   from var in query,
   where: ilike(var.name, ^name_search) or
      fragment("to_tsvector('english', (?->'description')::text) @@ to_tsquery('english', ?)",
               var.meta, ^desc_search)
  if order? do
    query = from(var in query, order_by: ilike(var.name, ^name_search))
  end

  query
 end
end

Когда я пытаюсь скомпилировать, я получаю эту ошибку

== Compilation error on file web/models/search.ex ==
** (Protocol.UndefinedError) protocol Enumerable not implemented for nil
(elixir) lib/enum.ex:1: Enumerable.impl_for!/1
(elixir) lib/enum.ex:112: Enumerable.reduce/3
(elixir) lib/enum.ex:1274: Enum.reduce/3
expanding macro: Ecto.Model.Dependent.__before_compile__/1
web/models/search.ex:1: Project.Search (module)

Это происходит только с последней версией Phoenix, она работала с версией 0.13.0.

Я попытался перейти на use Project.Web, :model, но получил ту же ошибку.


person Gidrek    schedule 28.08.2015    source источник
comment
Какое определение для like_escape? Когда вы говорите о последней версии Phoenix, вы имеете в виду 1.0.0 или 0.17.0?   -  person Onorio Catenacci    schedule 29.08.2015
comment
Версия 1.0.0, like_escape — это определение из Ecto.Model. Я проверил последнюю версию Ecto.Model и не нашел определения. Я изменил use Ecto.Model на import Ecto.Query, only: [from: 2] и увидел, что это работает   -  person Gidrek    schedule 29.08.2015
comment
Кажется, ошибка возникает из-за того, что вы не определили схему. В любом случае, Ecto должен выдать красивое сообщение об ошибке.   -  person José Valim    schedule 29.08.2015
comment
Спасибо. Это работало в более старых версиях, но я создам схему, чтобы исправить ошибку.   -  person Gidrek    schedule 31.08.2015


Ответы (1)


У меня тоже была эта ошибка при обновлении Phoenix/Ecto, в комментарии выше указано решение, но на случай, если это пропущено:

Если вы просто хотите работать с моделями (а не определять их), вам нужно использовать:

import Ecto.Model

где вы сейчас используете:

use Ecto.Model

use вызывает макрос __using__ в Ecto.Model, который, в свою очередь, вызывает use Ecto.Schema, поэтому вы видите здесь ошибку, так как Ecto.Schema не может найти схему, определенную в этом модуле. Вы можете узнать больше о том, что он делает, начиная с версии 1.0.2 здесь.

person Darian Moody    schedule 14.09.2015