Mysql
 sql >> Base de données >  >> RDS >> Mysql

Recherche de mots multiples avec Ruby et MySQL

Tout d'abord, je vous encourage fortement à déplacer la logique de Model dans Models. Au lieu de créer la logique de recherche dans le contrôleur, créez une méthode #search dans votre mode Quote.

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

et votre manette devient

# 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

Maintenant, revenons au problème d'origine. Votre logique de recherche existante fait une très grave erreur :elle interpole directement la valeur en ouvrant votre code à l'injection SQL. En supposant que vous utilisiez Rails 3, vous pouvez tirer parti de la nouvelle syntaxe #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

C'est un sujet un peu avancé. Je veux comprendre ce que le combined_scope + inject fait, je vous recommande de lire l'article Le Skinny on Scopes .