使用Ecto和PostgreSQL进行全文搜索时出错ERROR(undefined_table)

时间:2016-10-04 09:23:26

标签: postgresql elixir phoenix-framework ecto

我正在使用Ecto和PostgreSQL在我的Phoenix应用程序中尝试我的工具进行非常基本的全文搜索。基于我在控制器中的一个示例和PostgreSQL文档:

def search(conn, %{"q" => para}) do
    search = User |> User.search(para) |> Repo.all
    render(conn, "search.html", search: search)
  end

和我的"模型"文件(以及User字段的定义):

def search(query, search_term) do
    (from u in query,
    where: fragment("to_tsvector(u.name) @@ plainto_tsquery(?)", ^search_term),
    order_by: fragment("ts_rank(to_tsvector(u.name), plainto_tsquery(?)) DESC", ^search_term))
  end

我收到此错误:

ERROR (undefined_table): missing FROM-clause entry for table "u"

不是from u in query,足够(nameUser个字段之一)?

1 个答案:

答案 0 :(得分:2)

你不能那样使用u.nameu只是在将查询编译为SQL时存在于Elixir中的名称。它在编译时被重命名。您需要向?添加另一个fragment并为此传递u.name

def search(query, search_term) do
  from u in query,
    where: fragment("to_tsvector(?) @@ plainto_tsquery(?)", u.name, ^search_term),
    order_by: fragment("ts_rank(to_tsvector(?), plainto_tsquery(?)) DESC", u.name, ^search_term)
end