Chcę zrobić coś takiego:
SELECT * FROM USER WHERE NAME LIKE '%Smith%';
Moja próba w Arel:
# params[:query] = 'Smith'
User.where("name like '%?%'", params[:query]).to_sql
Jednak staje się to:
SELECT * FROM USER WHERE NAME LIKE '%'Smith'%';
Arel poprawnie opakowuje ciąg zapytania „Smith”, ale ponieważ jest to instrukcja LIKE, nie działa.
Jak zrobić zapytanie LIKE w Arel?
Bonus PS - tak naprawdę próbuję przeskanować dwa pola w tabeli, zarówno nazwę, jak i opis, aby sprawdzić, czy są jakieś dopasowania do zapytania. Jak by to działało?
ruby-on-rails
activerecord
arel
filsa
źródło
źródło
Odpowiedzi:
Oto jak wykonujesz podobne zapytanie w arel:
PS:
źródło
where("name like ?", ...)
, to podejście jest bardziej przenośne w różnych bazach danych. Na przykład spowodowałobyILIKE
to użycie w zapytaniu do bazy danych Postgres.User.where(users[:name].matches("%#{params[:user_name]}%"))
, próbowałemTRUNCATE users;
i innych podobnych zapytań i nic się nie stało po stronie sql. Wydaje mi się bezpieczne..gsub(/[%_]/, '\\\\\0')
do zmiany znaczenia znaków wieloznacznych MySql.Próbować
PS.
Aa i minęło dużo czasu, ale @ cgg5207 dodał modyfikację (głównie przydatne, jeśli zamierzasz wyszukiwać parametry o długich lub wielu nazwach lub jesteś zbyt leniwy, aby pisać)
lub
źródło
%
w podstawionym ciągu? Wygląda na to, że gdybyś chciał tylko jednostronnego symbolu wieloznacznego, nic nie powstrzymuje użytkownika przed przesłaniem wartości zapytania zawierającej%
na obu końcach (wiem, że w praktyce Railsy zapobiegają%
wyświetlaniu się w ciągu zapytania, ale wygląda na to, że powinny być przed tym chronione na poziomie ActiveRecord).to_sql
lub menedżera arel, jak wykonać sql na db?Odpowiedź Reubena Mallaby'ego można dalej skrócić, aby użyć powiązań parametrów:
źródło