使用 Ecto 和 PostgreSQL 进行全文搜索时出错 ERROR (undefined_table)
Error ERROR (undefined_table) in a full text search with Ecto and PostgreSQL
我正在尝试使用 Ecto 和 PostgreSQL 在我的 Phoenix 应用程序中实现非常基本的全文搜索。基于我的控制器中的一个示例和 PostgreSQL 文档:
def search(conn, %{"q" => para}) do
search = User |> User.search(para) |> Repo.all
render(conn, "search.html", search: search)
end
在我的 "model" 文件中(以及 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
还不够吗(name
是 User
字段之一)?
你不能那样使用 u.name
。 u
只是在将查询编译为 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
我正在尝试使用 Ecto 和 PostgreSQL 在我的 Phoenix 应用程序中实现非常基本的全文搜索。基于我的控制器中的一个示例和 PostgreSQL 文档:
def search(conn, %{"q" => para}) do
search = User |> User.search(para) |> Repo.all
render(conn, "search.html", search: search)
end
在我的 "model" 文件中(以及 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
还不够吗(name
是 User
字段之一)?
你不能那样使用 u.name
。 u
只是在将查询编译为 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