Mysql
 sql >> Database >  >> RDS >> Mysql

Ricerca di più parole con Ruby e MySQL

Innanzitutto, ti incoraggio vivamente a spostare la logica di Model in Models. Invece di creare la logica di ricerca nel Controller, crea un metodo di #ricerca nella tua modalità Preventivo.

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

e il tuo controller diventa

# 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

Ora, torniamo al problema originale. La tua logica di ricerca esistente fa un grave errore:interpola direttamente il valore aprendo il tuo codice a SQL injection. Supponendo che tu usi Rails 3 puoi sfruttare la nuova sintassi #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

È un argomento un po' avanzato. Voglio capire cos'è il combined_scope + inject ti consiglio di leggere l'articolo The Skinny on Scopes .