2016-10-04 3 views
0

Ich versuche meine sehr einfache Volltextsuche in meiner Phoenix-Anwendung mit Ecto und PostgreSQL zu implementieren. Basierend auf ein Beispiel und PostgreSQL docs Ich habe in meinem Controller:Fehler ERROR (undefined_table) in einer Volltextsuche mit Ecto und PostgreSQL

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

und in meiner "Modell" Datei (zusammen mit der Definition der User Felder):

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 

ich diese bekommen Fehler:

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

ist das nicht from u in query, genug (name ist eine von User Felder)?

Antwort

2

Sie können u.name nicht so verwenden. u ist nur ein Name, der in Elixir vorhanden ist, wenn die Abfrage an SQL kompiliert wird. Es wird umbenannt, während es kompiliert wird. Sie müssen eine andere ?-fragment hinzufügen und u.name für das passieren:

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

Es funktioniert, aber jetzt, wenn sie versuchen '<%[email protected]%>' in meiner Vorlage ich noch einen Fehler bekommen zugreifen, da ich alle Daten aus dem Modell bin immer: 'Listen in Phoenix.HTML und Templates dürfen nur Ganzzahlen enthalten, die Bytes, Binärdateien oder andere Listen repräsentieren, ungültiger Eintrag:% MyProj.User {__ meta__: # Ecto.Schema.Metadata <: geladen," Benutzer ">, Kontakte:" Tlm : 22222222 ", Details: nil, facebook: null, id: 16, inserted_at: # Ecto.DateTime <2016-10-03 13:55:30>, Name:" blabla ", aktualisiert_at: # Ecto.DateTime <2016- 10-03 13:55:30>, web_page: nil} '. Ich habe versucht, Punktnotation ohne Erfolg zu verwenden ... –

+0

'@ search' ist eine Liste. Was genau möchten Sie aus der Liste drucken? Sie können etwas wie 'for' verwenden:' <% = für Benutzer <- @search do%><% = user.name%><% end %> '. – Dogbert

+0

Richtig! Ich bin einfach zu verärgert, um klar zu denken! Das erste Mal mit SQL und dem Gefühl, dass ich es nie bekommen werde :) Ich werde ein paar mehr fokussierte Fragen öffnen, wenn ich nicht weiterkomme. Danke Dogbert! –

Verwandte Themen