我是使用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
以下是我如何调用查询函数
registrations = Repo.all RegistrationQuery.by_user("underwater")
这一切看起来与Ecto文档完全一致,但我找不到任何其他说法。但是我收到以下错误。
protocol Ecto.Queryable not implemented for [%Ensalutilo.Registration{user_id: "underwater"}]
答案 0 :(得分:6)
您的by_user/1
函数已在调用Repo.all
,因此稍后调用registrations = Repo.all(...)
时,您将传递第一个Repo.all
的结果作为参数,这是一个如您在错误消息中看到的列表!
要清楚,您会收到此错误消息,因为您可以将实现Ecto.Queryable协议的任何内容传递到Repo.all。