2013-07-09 27 views
7

Tôi có mẫu Người bao gồm tên và tôi muốn tìm kiếm các mẫu đơn giản nhất có thể.Kết hợp mẫu trong đường ray ("nơi cột LIKE '% foo%") với Postgres

Có phương thức đường ray/ActiveRecord dọc theo các dòng People.like(:name => "%#{query}%"), giống như những gì DataMapper có? Tôi không thể tìm thấy bất cứ điều gì như thế này trong tài liệu ActiveRecord nhưng tôi bị sốc nếu nó chỉ đơn giản là không thể.

Hiện tại tôi có nó đang hoạt động Person.where "name LIKE '%#{query}%'", hoạt động tuyệt vời nhưng là lỗ hổng SQL-injection rõ ràng.

Rails 3.2

+0

Không sử dụng bưu điện ILIKE thay vì LIKE? – sunny1304

+3

"Từ khóa ILIKE có thể được sử dụng thay cho LIKE để làm cho trường hợp không phân biệt chữ hoa chữ thường theo miền địa phương đang hoạt động. Đây không phải là tiêu chuẩn SQL mà là một phần mở rộng PostgreSQL." – AlexQueue

+0

ok, hiểu rồi. Cảm ơn. – sunny1304

Trả lời

27

Sử dụng một truy vấn tham số thay vì để tránh SQL-tiêm, như vậy:

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

Lưu ý rằng những dấu hiệu phần trăm phải là một phần của tham số, không phải là where khoản hoặc Rails sẽ thoát khỏi nó và bạn sẽ nhận được một lỗi cú pháp. (Ít nhất là trên bưu điện.)

ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: syntax error at or near "%" 
LINE 1: ...name LIKE %'John... 
        ^
Các vấn đề liên quan