Nejprve vám důrazně doporučuji přesunout logiku Modelu do Modelů. Namísto vytváření logiky vyhledávání v ovladači vytvořte v režimu nabídky #search metodu.
class Quote
def self.search(query)
...
end
end
a váš ovladač se stane
# 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
Nyní zpět k původnímu problému. Vaše stávající vyhledávací logika dělá velmi špatnou chybu:přímo interpoluje hodnotu otevírající váš kód do SQL injection. Za předpokladu, že používáte Rails 3, můžete využít výhod nové 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
Je to trochu pokročilé téma. Chci porozumět tomu, co je combined_scope
+ inject
ano, doporučuji vám přečíst si článek The Skinny on Scopes
.