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
.