2016-10-04 7 views
0

EctoとPostgreSQLを使ってPhoenixアプリケーションで非常に基本的な全文検索を実装しようとしています。エラーEctoとPostgreSQLを使った全文検索でのエラー(undefined_table)

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

と(Userフィールドの定義と一緒に)私の「モデル」ファイルに:私は私のコントローラを持っている一例とPostgreSQLのドキュメントに基づいて

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" 

は(nameUser分野の一つである)十分from u in query、ありませんか?

答えて

2

このような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 
+0

私のテンプレートで '' <%[email protected]%>にアクセスしようとすると、それは今働いしかしだ、私はモデルからすべてのデータを取得していますので、私は別のエラーが表示されます。 'Phoenix.HTMLのリストとテンプレートには、バイト、バイナリ、またはその他のリストを表す整数だけが含まれている可能性があります。%MyProj.User {__ meta__:#Ecto.Schema.Metadata <:loaded、" users ">、contacts:" Tlm :22222222 "、詳細:nil、facebook:nil、id:16、inserted_at:#Ecto.DateTime <2016-10-03 13:55:30>、名前:" blabla "、updated_at:#Ecto.DateTime <2016- 10-03 13:55:30>、web_page:nil} '私は成功していないドット記法を使ってみました... –

+0

'@ search'はリストです。リストから正確に何を印刷したいですか?あなたは 'for'のようなものを使うことができます: '<%= for user < - @search do%><%= user.name%><% end %>'。 – Dogbert

+0

右私はまっすぐ考えることがあまりにも気になる!初めてSQLを使用し、それが決して得られないような気がする:)私は固まっていくにつれ、もっと集中的な質問をいくつか開きます。おかげでドッグベルト! –

関連する問題