2012-07-20 11 views
5

Podczas przeszukiwania bazy danych MYSQL dla aplikacji Rails 2.3.14, potrzebuję odpowiednio uciec z ciągu wyszukiwania, aby móc wyszukiwać ciągi zawierające apostrofy (apostrofy). Jaki jest najlepszy sposób na zrobienie tego? Używam klejnotu mysql, na wszelki wypadek.Jak uciec dla zapytań MYSQL z Ruby on Rails?

Odpowiedz

5

Można użyć ActiveRecord za quote metody (np ActiveRecord::Base.connection.quote("string with ' apostrophe")), ale metody kwerendy ActiveRecord już ucieczkę SQL dla Ciebie. Na przykład:

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

zmieni „ciąg z 'apostrof” do «ciąg z«»apostrof»

+1

Jest to przydatne w przypadku krótkich zapytań, ale w przypadku bardziej złożonych zapytań faktycznie łatwiej jest korzystać z SQL bardziej bezpośrednio. Patrzę na przypadek, w którym przeszukuję pięć różnych tabel, i bardzo trudno jest śledzić, która zmienna jest dopasowana do której części zapytania używa tej składni. – joanwolk

+0

Spójrz na zakresy. Pozwalają one podzielić zapytanie na logiczne fragmenty, a następnie połączyć je w razie potrzeby. Jest znacznie czystszy – Angelo

+1

Mamy zakresy. Oddzielnie: aplikacja, o której mowa, używa również surowych zapytań SQL zamiast metod Rails SQL, dlatego nie będę przełączać tego kodu z powrotem do metod ActiveRecord. – joanwolk

8

Podczas korzystania z klejnotu mysql uzyskujesz metodę Mysql.escape_string(). Używać w następujący sposób:

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

Gdzie jest coś takiego dla PostgreSQL ?? –

8

Szyny quotes strings w następujący sposób:

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

To działało z postgresql –

+0

To jest fajne, dzięki – jahrichie