修复协议Ecto.Queryable未实现错误

jus*_*ese 4 elixir ecto phoenix-framework

我是新手使用Ecto和Elixir而且我遇到了一个我无法解释的错误.我的代码看起来就像Ecto README中的示例.

以下是Ecto模型和查询的模块

defmodule Registration do
  use Ecto.Model

  schema "registrations" do
    field :user_id, :string
    field :created_at, :datetime, default: Ecto.DateTime.local
    field :updated_at, :datetime, default: Ecto.DateTime.local
  end
end

defmodule RegistrationQuery do
  import Ecto.Query

  def by_user(user_id) do
    query = from r in Registration,
          where: r.user_id == ^user_id,
         select: r
    Repo.all(query)
  end
end
Run Code Online (Sandbox Code Playgroud)

以下是我调用查询函数的方法

registrations = Repo.all RegistrationQuery.by_user("underwater")
Run Code Online (Sandbox Code Playgroud)

这一切似乎与Ecto文档完全一致,我找不到任何其他说法.但是我收到以下错误.

protocol Ecto.Queryable not implemented for [%Ensalutilo.Registration{user_id: "underwater"}]
Run Code Online (Sandbox Code Playgroud)

Jos*_*lim 6

您的by_user/1函数已经在调用Repo.all,所以当您registrations = Repo.all(...)稍后调用时,您将传递第一个Repo.all参数的结果,这是一个列表,如您在错误消息中看到的那样!

要清楚,您会收到此错误消息,因为您可以将实现Ecto.Queryable协议的任何内容传递到Repo.all.