Frage

Ich brauche eine einfache Suche zu erstellen, aber ich kann nicht leisten, Sphinx zu verwenden.

Hier ist, was ich schrieb:


keywords = input.split(/\s+/)
queries = []

keywords.each do |keyword|
  queries << sanitize_sql_for_conditions(
              "(classifications.species LIKE '%#{keyword}%' OR 
               classifications.family LIKE '%#{keyword}%' OR 
               classifications.trivial_names LIKE '%#{keyword}%' OR
               place LIKE '%#{keyword}%')")
end

options[:conditions] = queries.join(' AND ')

Nun sanitize_sql_for_conditions funktioniert nicht! Es gibt einfach gibt die ursprüngliche Zeichenfolge.

Wie kann ich diesen Code neu schreiben bösartigen Code zu entkommen?

War es hilfreich?

Lösung

Wenn Sie die „# {keyword}“ ersetzen mit einem „?“, Können Sie etwas tun. Mit dem Fragezeichen wird automatisch SQL sanieren.

keywords = input.split(/\s+/)
queries = []
vars = []

keywords.each do |keyword|
  queries << "(classifications.species LIKE '%?%' OR 
               classifications.family LIKE '%?%' OR 
               classifications.trivial_names LIKE '%?%' OR
               place LIKE '%?%')"
  vars = vars << keyword << keyword << keyword << keyword
end

options[:conditions] = [queries.join(' AND '), vars].flatten

Andere Tipps

Ich benutze eine Menge von benutzerdefinierten Bedingungen in Active, aber Ich mag sie in einem Array von Arrays Zustand verpacken, dann kombinieren ‚em, mit der? Wert lässt AR santize sie automatisch:

conditions = Array.new
conditions << ["name = ?", "bob"]
conditions << ["(created_at > ? and created_at < ?)", 1.year.ago, 1.year.from_now]  

User.find(:first, :conditions => combine_conditions(conditions))

 def combine_conditions(somearray) # takes an array of condition set arrays and reform them into a AR-compatible condition array
   conditions = Array.new
   values = Array.new
   somearray.each do |conditions_array|
     conditions << conditions_array[0] # place the condition in an array
     # extract values
     for i in (1..conditions_array.size - 1)
       values << conditions_array[i]
     end 
   end
   [conditions.join(" AND "), values].flatten
 end
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top