Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Pesquisa de várias palavras com Ruby e MySQL


Primeiro, eu encorajo você a mover a lógica do Model para Models. Em vez de criar a lógica de pesquisa no Controller, crie um método #search no seu modo de cotação.
class Quote
  def self.search(query)
    ...
  end
end

e seu controlador se torna
# 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

Agora, de volta ao problema original. Sua lógica de pesquisa existente comete um erro muito grave:ela interpola diretamente o valor abrindo seu código para injeção de SQL. Supondo que você use Rails 3, você pode aproveitar a nova sintaxe #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

É um tópico um pouco avançado. Se você quer entender o que o combined_scope + inject sim, recomendo que você leia o artigo O magro em escopos .