sql >> Base de Datos >  >> RDS >> Mysql

Búsqueda de varias palabras con Ruby y MySQL

Primero, le recomiendo que mueva la lógica de Model a Models. En lugar de crear la lógica de búsqueda en el controlador, cree un método #search en su modo de cotización.

class Quote
  def self.search(query)
    ...
  end
end

y su controlador se convierte en

# receives a string, splits it in a array of words, create the 'conditions'
# query, and send it to ActiveRecord
def search
  @quotes = Quote.search(params[:query])
end

Ahora, de vuelta al problema original. Su lógica de búsqueda existente comete un error muy grave:interpola directamente el valor abriendo su código a la inyección de SQL. Suponiendo que usa Rails 3, puede aprovechar la nueva sintaxis #where.

class Quote
  def self.search(query)
    words = query.to_s.strip.split
    words.inject(scoped) do |combined_scope, word|
      combined_scope.where("quote LIKE ?", "%#{word}%")
    end
  end
end

Es un tema un poco avanzado. Quiero entender qué es el combined_scope + inject lo hace, le recomiendo que lea el artículo The Skinny on Scopes .