2012-07-20 12 views
5

Durante la ricerca del database MYSQL per un'app Rails 2.3.14, ho bisogno di sfuggire la stringa di ricerca in modo appropriato in modo da poter cercare stringhe contenenti virgolette singole (apostrofi). Qual'è il miglior modo per farlo? Sto usando la gemma mysql, nel caso che importi.Come eseguire l'escape per query MYSQL da Ruby on Rails?

risposta

5

È possibile utilizzare il metodo di quote ActiveRecord (ad esempio ActiveRecord::Base.connection.quote("string with ' apostrophe")), ma i metodi di query di ActiveRecord già fuggire SQL per voi. Per esempio:

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

cambierà "stringa con 'apostrofo" a "stringa con '' apostrofo"

+1

Ciò è utile per le query brevi, ma per le query più complesse diventa più facile utilizzare l'SQL in modo più diretto. Sto osservando un caso in cui cerco in cinque diverse tabelle, e diventa molto difficile rintracciare quale variabile è abbinata alla parte della query che usa questa sintassi. – joanwolk

+0

Cerca negli ambiti. Ti permettono di suddividere la tua query in blocchi logici, e quindi concatenarli secondo necessità. È molto più pulito – Angelo

+1

Abbiamo degli ambiti. Separatamente: l'app in questione utilizza anche query SQL raw anziché i metodi Rails SQL come considerazione delle prestazioni, quindi non cambierò questo codice nei metodi ActiveRecord. – joanwolk

8

Quando si utilizza la gemma mysql, si ottiene il metodo Mysql.escape_string(). Utilizzare come segue:

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

dove è qualcosa di simile per Postgres ?? –

8

Rails quotes strings come segue:

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

Questo ha funzionato con postgresql –

+0

Questo è bello, grazie – jahrichie