Først vil jeg kraftigt opfordre dig til at flytte Models logik ind i Models. I stedet for at oprette søgelogikken i controlleren, skal du oprette en #søgemetode i din tilbudstilstand.
class Quote
def self.search(query)
...
end
end
og din controller bliver
# 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
Nu tilbage til det oprindelige problem. Din eksisterende søgelogik begår en meget slem fejl:den interpolerer direkte værdi ved at åbne din kode til SQL-injektion. Forudsat at du bruger Rails 3, kan du drage fordel af den nye #where-syntaks.
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
Det er et lidt avanceret emne. Jeg vil gerne forstå, hvad combined_scope
er + inject
gør, anbefaler jeg dig at læse artiklen The Skinny on Scopes
.