Ich versuche eine ähnliche Abfrage zu machen
def self.search(search, page = 1 )
paginate :per_page => 5, :page => page,
:conditions => ["name LIKE '%?%' OR postal_code like '%?%'", search, search], order => 'name'
end
Aber wenn es ausgeführt wird, fügt etwas Anführungszeichen hinzu, was dazu führt, dass die SQL-Anweisung so herauskommt
SELECT COUNT(*)
FROM "schools"
WHERE (name LIKE '%'havard'%' OR postal_code like '%'havard'%')):
Sie können also mein Problem sehen. Ich benutze Rails 4 und Postgres 9, die ich beide noch nie benutzt habe. Ich bin mir also nicht sicher, ob es sich um ein Activerecord-Ding oder möglicherweise ein Postgres-Ding handelt.
Wie kann ich das so einrichten, dass ich es '%my_search%'
in der Endabfrage mag ?
sql
ruby-on-rails
ruby
postgresql
activerecord
Harry Forbess
quelle
quelle
search
Saiten bereinigt??
in der wo wird für die Desinfektion%
und_
innerhalbsearch
werden bei diesem Ansatz nicht bereinigt .Verwenden Sie stattdessen
conditions
diewhere
Methode von Rails 4, anstatt die Syntax von Rails 2 zu verwenden :HINWEIS: In der obigen Beschreibung wird anstelle von? Die Parametersyntax verwendet. Platzhalter: Beide sollten dieselbe SQL generieren.
HINWEIS: Verwenden Sie
ILIKE
für den Namen - postgres Groß- und Kleinschreibung von LIKEquelle
Movie.where("title ILIKE :s", s: search_string)
esSELECT 1 AS one FROM "movies" WHERE (title ILIKE 'test') LIMIT $1
von ActiveRecord (Rails 5.1.6) übersetzt - bitte beachten Sie, dass es nach dem ILIKE kein Prozentzeichen gibt)search_string
Variable gehen. Ich denke, dieSELECT 1 AS one
Ausgabe ist nur in der Rails-Konsole oder Sie verwendenlimit(1)
? Zu Ihrer Information: Rails 5.1.6 hat Sicherheitsprobleme. Verwenden Sie stattdessen 5.1.6.2 oder 5.1.7Während die String-Interpolation funktioniert, da Ihre Frage Rails 4 angibt, könnten Sie Arel dafür verwenden und Ihre App-Datenbank agnostisch halten.
quelle
ActiveRecord ist klug genug, um zu wissen, dass der Parameter, auf den
?
sich das bezieht, eine Zeichenfolge ist, und schließt ihn daher in einfache Anführungszeichen ein. Sie können, wie in einem Beitrag vorgeschlagen, die Ruby-String-Interpolation verwenden, um den String mit den erforderlichen%
Symbolen aufzufüllen. Dies kann Sie jedoch einer SQL-Injection aussetzen (was schlecht ist). Ich würde vorschlagen, dass Sie die SQL-CONCAT()
Funktion verwenden, um den String wie folgt vorzubereiten:"name LIKE CONCAT('%',?,'%') OR postal_code LIKE CONCAT('%',?,'%')", search, search)
quelle
%
angehängt / vorangestellt ist oder nicht). Entweder funktioniert es wie erwartet oder Rails hat einen großen Fehler, der beide Fälle betrifft.Versuchen
Weitere Informationen finden Sie in den Dokumenten zu den AREL-Bedingungen.
quelle
quelle