Ich möchte so etwas tun wie:
SELECT * FROM USER WHERE NAME LIKE '%Smith%';
Mein Versuch in Arel:
# params[:query] = 'Smith'
User.where("name like '%?%'", params[:query]).to_sql
Dies wird jedoch:
SELECT * FROM USER WHERE NAME LIKE '%'Smith'%';
Arel umschließt die Abfragezeichenfolge 'Smith' korrekt, aber da dies eine LIKE-Anweisung ist, funktioniert sie nicht.
Wie macht man eine LIKE-Abfrage in Arel?
PS-Bonus - Ich versuche tatsächlich, zwei Felder in der Tabelle zu scannen, sowohl den Namen als auch die Beschreibung, um festzustellen, ob die Abfrage übereinstimmt. Wie würde das funktionieren?
ruby-on-rails
activerecord
arel
filsa
quelle
quelle
Antworten:
So führen Sie eine ähnliche Abfrage in arel durch:
PS:
quelle
where("name like ?", ...)
ist dieser Ansatz für verschiedene Datenbanken portabler. Dies würde beispielsweise dazu führen,ILIKE
dass eine Abfrage für eine Postgres-Datenbank verwendet wird.User.where(users[:name].matches("%#{params[:user_name]}%"))
, ich habe es versuchtTRUNCATE users;
und andere solche Abfragen und nichts ist auf der SQL-Seite passiert. Sieht für mich sicher aus..gsub(/[%_]/, '\\\\\0')
Option, um MySQL-Platzhalterzeichen zu maskieren.Versuchen
PS.
Aaund es ist lange her, aber @ cgg5207 hat eine Änderung hinzugefügt (meistens nützlich, wenn Sie nach lang- oder mehreren langnamigen Parametern suchen oder zu faul sind, um sie einzugeben).
oder
quelle
%
in der ersetzten Zeichenfolge entkommen soll ? Es scheint, als ob Sie nur einen einseitigen Platzhalter wollten, aber nichts hindert den Benutzer daran, einen Abfragewert zu senden, der%
an beiden Enden enthalten ist (ich weiß, dass Rails in der Praxis verhindert,%
dass er in einer Abfragezeichenfolge angezeigt wird, aber es scheint so sollte auf ActiveRecord-Ebene dagegen geschützt sein).to_sql
oder des Arel-Managers. Wie führe ich den SQL- Code auf der Datenbank aus?Die Antwort von Reuben Mallaby kann weiter verkürzt werden, um Parameterbindungen zu verwenden:
quelle