Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Mehrfachwortsuche mit Ruby und MySQL

Zunächst empfehle ich Ihnen dringend, die Logik von Model in Models zu verschieben. Anstatt die Suchlogik im Controller zu erstellen, erstellen Sie eine #Suchmethode in Ihrem Angebotsmodus.

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

und Ihr Controller wird zu

# 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

Nun zurück zum ursprünglichen Problem. Ihre vorhandene Suchlogik begeht einen sehr schweren Fehler:Sie interpoliert direkt den Wert, der Ihren Code für die SQL-Injection öffnet. Angenommen, Sie verwenden Rails 3, können Sie die Vorteile der neuen #where-Syntax nutzen.

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

Es ist ein bisschen fortgeschrittenes Thema. Ich möchte verstehen, was der combined_scope ist + inject tut, empfehle ich Ihnen, den Artikel The Skinny on Scopes .