【问题标题】:Compilation error with Ecto and Phoenix and EnumerableEcto、Phoenix 和 Enumerable 的编译错误
【发布时间】:2015-11-23 14:29:41
【问题描述】:

我有这个代码

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,但我得到了同样的错误。

【问题讨论】:

  • “like_escape”的定义是什么?当您说“Phoenix 的最新版本”时,您是指 1.0.0 还是 0.17.0?
  • 版本 1.0.0,like_escape 是来自 Ecto.Model 的定义。我检查了 Ecto.Model 的最新版本,但没有找到定义。我已将 use Ecto.Model 更改为 import Ecto.Query, only: [from: 2] 并看到它正在工作
  • 似乎错误正在发生,因为您没有定义“模式”。无论如何,Ecto 应该在这里提出一个很好的错误消息。
  • 谢谢。它在旧版本中工作,但我将创建一个架构来修复错误

标签: elixir phoenix-framework ecto


【解决方案1】:

我在升级 Phoenix/Ecto 时也遇到了这个错误,上面的评论说明了解决方案,但万一这被遗漏了:

如果您只想使用模型(而不是定义模型),则需要使用:

import Ecto.Model

您当前使用的位置:

use Ecto.Model

use 调用 Ecto.Model 上的 __using__ 宏,该宏又调用 use Ecto.Schema,这就是您在此处看到错误的原因,因为 Ecto.Schema 无法找到该模块中定义的架构。从 v1.0.2 here 开始,您可以详细了解它的功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    相关资源
    最近更新 更多