sql >> Database teknologi >  >> RDS >> Mysql

Søgning efter flere ord med Ruby og MySQL

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 .



  1. Minimering af SQL-forespørgsler ved hjælp af join med en-til-mange-relation

  2. SQLite ingen sådan kolonne

  3. Hvad betyder Clustered og Non-Clustered indeks egentlig?

  4. Filtrerer MySQL-data i PHP til kun at vise data fra den aktuelle sessions bruger?