2013-07-09 15 views
7

Mam model osoby, który zawiera nazwy i chcę je wyszukać w najprostszy możliwy sposób.Dopasowywanie wzorców w szynach ("gdzie kolumna LIKA"% foo% ") z Postgresem

Czy istnieje metoda szyn/ActiveRecord wzdłuż linii People.like(:name => "%#{query}%"), podobnie jak w DataMapper? Nie mogłem znaleźć czegoś takiego w dokumentach ActiveRecord, ale jestem zszokowany, jeśli to po prostu niemożliwe.

Obecnie mam to robi Person.where "name LIKE '%#{query}%'", który działa świetnie, ale jest oczywistą podatnością na atak SQL.

szyn 3,2

+0

Czy postgres używa ILIKE zamiast LIKE? – sunny1304

+3

"Można użyć słowa kluczowego ILIKE zamiast LIKE, aby dopasować wielkość liter nie zależnie od aktywnego locale, nie jest to w standardzie SQL, ale jest rozszerzeniem PostgreSQL." – AlexQueue

+0

ok, rozumiem. Dzięki. – sunny1304

Odpowiedz

27

Zastosowanie zapytania parametrycznego zamiast uniknąć SQL iniekcji, tak jak poniżej:

Person.where('name LIKE ?', '%' + query + '%') 

Należy zauważyć, że znaki procent musi stanowić część parametru nie klauzula where lub Railsy uciekną, a otrzymasz błąd składni. (Przynajmniej na postgresie.)

ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: syntax error at or near "%" 
LINE 1: ...name LIKE %'John... 
        ^
Powiązane problemy