2012-07-20 9 views
5

Al buscar en la base de datos MYSQL una aplicación Rails 2.3.14, necesito escapar de la cadena de búsqueda de forma adecuada para poder buscar cadenas que contengan comillas simples (apóstrofes). ¿Cuál es la mejor manera de hacer esto? Estoy usando la gema mysql, en caso de que eso importe.¿Cómo escapar para consultas MYSQL de Ruby on Rails?

Respuesta

5

Se puede utilizar el método de quote ActiveRecord (por ejemplo ActiveRecord::Base.connection.quote("string with ' apostrophe")), pero los métodos de consulta de ActiveRecord ya escapar de su SQL para usted. Por ejemplo:

a = "string with ' apostrophe" 
ModelName.where("field1 = ?", a) 

va a cambiar "la cadena con 'apóstrofe" a "la cadena con '' apóstrofe"

+1

Esto es bueno para consultas cortas, pero para consultas más complejas, en realidad es más fácil usar el SQL más directamente. Estoy mirando un caso en el que busco en cinco tablas diferentes, y es muy difícil rastrear qué variable se corresponde con qué parte de la consulta utiliza esta sintaxis. – joanwolk

+0

Buscar en los ámbitos. Le permiten dividir su consulta en fragmentos lógicos, y luego encadenarlos según sea necesario. Es mucho más limpio – Angelo

+1

Tenemos ámbitos. Separadamente: la aplicación en cuestión también utiliza consultas SQL sin procesar en lugar de los métodos Rails SQL como una consideración de rendimiento, por lo que no cambiaré este código a los métodos de ActiveRecord. – joanwolk

8

Al usar la gema mysql, obtiene el método Mysql.escape_string(). Utilice la siguiente manera:

search_terms = Mysql.escape_string("it's working!") 
conditions = [ "table1.name LIKE '%#{search_terms}%'" ] 
# use conditions for MYSQL query as appropriate 
+1

donde es algo como esto para postgres ?? –

8

rieles quotes strings de la siguiente manera:

# Quotes a string, escaping any ' (single quote) and \ (backslash) characters. 
def quote_string(s) 
    s.gsub(/\\/, '\&\&').gsub(/'/, "''") # ' (for ruby-mode) 
end 
+0

Esto funcionó con postgresql –

+0

Esto es genial, gracias – jahrichie