2010-07-21 2 views

Antwort

8

Sql like kann in einigen Fällen sehr ineffizient sein, zum Beispiel in many cases in MySQL. Ich empfehle eine Volltextindizierung wie Sphinx, Xapian oder Lucene.

+0

so gibt es in Active Record keine Möglichkeit zu suchen für eine Zeichenfolge in jeder Tabelle und deren Spalten? –

+0

Die Suche in allen Tabellen könnte mit roher Abfrage wie folgt durchgeführt werden: 'SELECT 'table1' AS Tabellenname, ID FROM Tabelle1 WHERE c1 LIKE"% Text% "ODER c2 LIKE"% Text% "UNION ALL SELECT 'Tabelle2' AS Tabellenname, ID FROM Tabelle2 WHERE c3 Wie "% Text%", aber ich würde das nicht tun, es ist total peinlich. Wenn Sie MySQL verwenden, verfügt es über einige Volltextindizierungsfunktionen - http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html - aber ich weiß nicht, wie gut es ist. Ich weiß nichts über die Unterstützung von Volltextsuchen in anderen relationalen DBs. Zusammenfassend - AR wird nicht helfen, verwenden Sie Volltextindizierung Software, wenn Sie können. – skalee

+0

Gerade gefunden vor einer Sekunde, kann es Ihnen helfen http://snowgiraffe.com/rdocs/ar-extensions/classes/ActiveRecord/Base.html – skalee

11
Model.find(:all, :conditions => ['name LIKE ?', "%#{tag}%"]) 

Wo-Tag ist Ihre Variable die Zeichenfolge

per @bjg Kommentar enthält: -

Oder in Rails 3 Sie das schreiben würde wie

Model.where(["name LIKE :tag", {:tag => tag}]) 

die neue Verwendung Finder-Syntax -

+2

Oder in Rails 3 du das schreiben würde wie 'Model.where ([ "name LIKE: tag", {: tag => tag}])' mit dem neuen Finder Syntax – bjg

+0

aber wie kann ich feststellen, RoR3 Suche in allen Spalten für dieses Modell nicht nur in der Spalte "Name"? –

+0

@never_had_a_name überprüfen sphinx Suchmaschine dafür. Check thinking sphinx http://railscasts.com/episodes/120-thinking-sphinx –

3

können Sie auch Arels "Match" -Methode verwenden:

Model.match(:name => tag) 

Wenn Sie in allen Spalten suchen möchten, sollten Sie zusätzlichen Code schreiben.

+0

Funktioniert nicht für mich. – squixy

+0

Funktioniert auch nicht für mich. Mit 'arel' würde ich die Abfrage wie folgt schreiben:' Model.where (Model.arel_table [: name] .matches ("% # {query_string}%")) ' – tsikov

2

denke ich acts_as_ferret Plugin für Ihre Bedürfnisse perfekt sein würde, dieses Plugin ermöglicht es Ihnen, wie

ActsAsFerret::define_index('my_index', 
         :models => { 
          SomeModel => { 
          :fields => { 
           :name => { :boost => 4, :store => :yes, :via => :ferret_title }, 
           :foo => { :store => :no, :index => :untokenized }, 
           :baz => { :store => :yes, :via => :ferret_content } 
          } 
          } 
         }) 

Alle acts_as_ferret Indizes leicht sehr cool Indizes zu konfigurieren sind in einer einzigen Datei konfiguriert, RAILS_ROOT/config/aaf.rb

+0

Nicht nur Freret. Sphinx 'Denk-Sphinx integriert sich auch gut in AR. Im Allgemeinen ist die Verwendung von Volltextindikationssoftware eine gute Idee. – skalee

+0

Ferret ist eine Art von Schmerzen im Hinterland. Es ist langsam, es ist anfällig für Korruption, und ich hatte nur Probleme damit. Denken-Sphinx ist der Weg zu gehen. –

2

Wenn Sie Heroku bereitstellen oder nicht dagegen db Agnostizismus fallen, Postgres Volltextsuche Unterstützung hat. Sie müssen keinen zusätzlichen Dienst ausführen. Neben PG ist die beste OS-Datenbank. http://tenderlove.github.com/texticle/

Verwandte Themen