Próbuję wykonać podobne zapytanie
def self.search(search, page = 1 )
paginate :per_page => 5, :page => page,
:conditions => ["name LIKE '%?%' OR postal_code like '%?%'", search, search], order => 'name'
end
Ale kiedy jest uruchamiany, coś dodaje cudzysłowy, co powoduje, że instrukcja sql wygląda tak
SELECT COUNT(*)
FROM "schools"
WHERE (name LIKE '%'havard'%' OR postal_code like '%'havard'%')):
Więc możesz zobaczyć mój problem. Używam Rails 4 i Postgres 9, z których nigdy nie korzystałem, więc nie jestem pewien, czy jest to rzecz z aktywnym nagraniem, czy może postgres.
Jak mogę to ustawić tak, żeby '%my_search%'
w końcu było zapytanie?
sql
ruby-on-rails
ruby
postgresql
activerecord
Harry Forbess
źródło
źródło
search
struny są odkażone??
gdzie zajmie się odkażaniem%
i_
wewnątrzsearch
nie zostaną odkażone.Zamiast używać
conditions
składni z Rails 2, użyjwhere
metody Rails 4 :UWAGA: powyższe używa składni parametru zamiast? symbol zastępczy: oba powinny generować ten sam sql.
UWAGA: używając
ILIKE
nazwy - postgres wersja LIKE bez rozróżniania wielkości literźródło
Movie.where("title ILIKE :s", s: search_string)
to zostanie przetłumaczone naSELECT 1 AS one FROM "movies" WHERE (title ILIKE 'test') LIMIT $1
przez ActiveRecord (Rails 5.1.6) - proszę zauważyć, że posearch_string
zmiennej zostanie umieszczony procent . Myślę, żeSELECT 1 AS one
wyjście jest tylko w konsoli railsowej lub używaszlimit(1)
? FYI: Rails 5.1.6 ma problemy z bezpieczeństwem, użyj zamiast tego 5.1.6.2 lub 5.1.7Chociaż interpolacja ciągów zadziała, ponieważ twoje pytanie określa rails 4, możesz użyć do tego Arel i zachować agnostyk bazy danych aplikacji.
źródło
ActiveRecord jest na tyle sprytny, że wie, że parametr, do którego odwołuje
?
się ciąg, jest ciągiem znaków, więc zawiera go w pojedynczych cudzysłowach. Ty może jako jedno stanowisko sugeruje używanie Ruby interpolacji ciąg pad ciąg z wymaganymi%
symbolami. Może to jednak narazić Cię na wstrzyknięcie SQL (co jest złe). Sugerowałbym użycieCONCAT()
funkcji SQL do przygotowania ciągu w następujący sposób:"name LIKE CONCAT('%',?,'%') OR postal_code LIKE CONCAT('%',?,'%')", search, search)
źródło
%
jest dołączane / poprzedzane, czy nie). Albo działa zgodnie z oczekiwaniami, albo railsy mają poważny błąd wpływający na oba przypadki.Próbować
Więcej informacji można znaleźć w dokumentach dotyczących warunków AREL.
źródło
źródło