Ich habe ein Modell namens Topic, das einen Namen als Feld hat.
Sagen wir also, ich habe einen Begriff, nach dem ich suche, Apfel.
Wenn ich a mache
Topic.find_by_name("apple")
Ich bekomme eine Platte mit dem Namen Apfel zurück. Das ist gut - aber wie ändere ich find_by_name so, dass es sowohl "Apfelsaft" als auch "Apfel" findet - im Grunde Namen finden, die die ursprüngliche Abfrage enthalten oder genau mit der ursprünglichen Abfrage übereinstimmen?
Edit: Danke für die Antwort. Ich denke, ich hätte früher etwas klarer sein sollen, aber was ist, wenn ich unter einem Variablennamen suchen möchte (natürlich werde ich nicht jedes Mal unter dem Namen "Apfel" suchen wollen :))?
Wie manipuliere ich Topic.where, um dies zu berücksichtigen? Also so etwas wie ...
@topic = Topic.where(......., @name)
Topic.where("name like ?","#{@name}%")
wäre eine Möglichkeit.Antworten:
Ich denke so etwas sollte funktionieren:
Topic.where("name like ?", "%apple%")
So passen Sie sich Ihrer Bearbeitung an:
Topic.where("name like ?", "%#{@search}%")
Bei der einfachen String-Interpolation verwenden Sie den Wert von
@search
innerhalb des Strings%%
, sodass@search = "apple"
Sie am Ende den Wert erhalten%apple%
quelle
where
schützt die Methode nicht vor SQL-Injection. Die Frage kann jedoch nur dann wirklich beantwortet werden, wenn berücksichtigt wird, ob diese Variable jemals Benutzereingaben ausgesetzt ist, entweder über einen gespeicherten nicht bereinigten Wert oder direkt. Das sollte die Frage des Interesses sein. Der beste Weg, um der SQL-Injection entgegenzuwirken, besteht darin, die Werte bei der Anwendungseingabe bereits vor der Speicherung zu bereinigen.Mit PostgreSQL können Sie auch Match-Operatoren verwenden :
Topic.where("name ~* ?", @search)
quelle
Sieht so aus, als würden Sie in Rails 3 Folgendes verwenden:
Topic.where("name ILIKE ?", "%apple%")
quelle
~=
Operator arbeitet für PostgreSQL - es ist eine Regex-Übereinstimmung. Aber ja, Scotts Antwort sollte funktionieren. Möglicherweise möchten Sie ILIKE verwenden, bei dem die Suche ohne Berücksichtigung der Groß- und Kleinschreibung erfolgt.Setzen Sie den String nicht direkt so ein. Es heißt SQL-Injection. Sie sollten stattdessen verwenden
.where
:Topic.where("name like '?%' ", params[:name])
quelle
%
Beispiel vor der AuswechslungTopic.where("name like ?", "#{params[:name]}%").
Versuchen
Topic.where("name like ?",'%apple%') Topic.find(:all, :conditions => ["name like ?","%apple%"])
quelle
Topic.where("name like ?","%apple%")
. Der zweite ist in Ordnung.Topic.find_by("name like ?", "%apple%")