2013-07-09 28 views
7

我有一個包含名稱的Person模型,我想盡可能簡單地搜索這些模型。在rails中的模式匹配(「where列LIKE'%foo%」)與Postgres

沿着People.like(:name => "%#{query}%")的方向是否存在rails/ActiveRecord方法,就像DataMapper所具有的一樣?在ActiveRecord文檔中我找不到這樣的東西,但如果根本無法實現,我感到震驚。

目前我做的是Person.where "name LIKE '%#{query}%'",它工作的很好,但是卻是一個明顯的SQL注入漏洞。

的Rails 3.2

+0

Isnt postgres使用ILIKE而不是LIKE? – sunny1304

+3

「根據活動語言環境,可以使用關鍵字ILIKE而不是LIKE來使匹配不區分大小寫。這不是SQL標準,而是PostgreSQL擴展。」 – AlexQueue

+0

好吧,明白了。謝謝。 – sunny1304

回答

27

使用參數化查詢來避免SQL-注入,像這樣:

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

注意百分號必須是參數的一部分,而不是where條款或Rails會逃避它,你會得到一個語法錯誤。 (至少在postgres上)

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