2010-07-21 12 views

risposta

8

Sql like può essere molto inefficiente in alcuni casi, ad esempio in many cases in MySQL. Raccomando di utilizzare alcuni programmi di indicizzazione full-text come Sphinx, Xapian o Lucene.

+0

quindi non c'è modo in Active Record per cercare per una stringa in ogni tabella e le loro colonne? –

+0

La ricerca in tutte le tabelle può essere eseguita con query raw come questa: 'SELECT 'table1' AS nome_tabella, id FROM tabella1 WHERE c1 LIKE"% text% "O c2 LIKE"% text% "UNION ALL SELECT 'table2' AS nome_tabella, id FROM table2 WHERE c3 LIKE "% text%" ', ma non lo farei, è assolutamente imbarazzante. Se si utilizza MySQL, ha alcune funzionalità di indicizzazione full-text - http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html - ma non so quanto sia bello. Non conosco il supporto per la ricerca full-text in altri DB relazionali. Ricapitolando - AR non ti aiuterà, usa il software di indicizzazione full-text se puoi. – skalee

+0

Appena trovato un attimo fa, può aiutarti http://snowgiraffe.com/rdocs/ar-extensions/classes/ActiveRecord/Base.html – skalee

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

Dove tag è la variabile che contiene la stringa

come da commento @bjg: -

O in Rails 3 si avrebbe scritto questo come

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

utilizzando il nuovo sintassi finder -

+2

O in Rails 3 devi scrivere questo come 'Model.where ([ "nome come: tag", {: tag => tag}])' utilizzando la nuova sintassi cercatore – bjg

+0

ma come faccio a dire RoR3 cercare in TUTTE le colonne per quel modello non solo nella colonna "nome"? –

+0

@never_had_a_name controlla il motore di ricerca sphinx per quello. Controlla la sfinge del pensiero http://railscasts.com/episodes/120-thinking-sphinx –

3

puoi anche utilizzare il metodo 'match' di Arel:

Model.match(:name => tag) 

se si desidera eseguire la ricerca in tutte le colonne, è necessario scrivere del codice aggiuntivo.

+0

Non funziona per me. – squixy

+0

Non funziona neanche per me. Usando 'arel', vorrei scrivere la query in questo modo:' Model.where (Model.arel_table [: name] .matches ("% # {query_string}%")) ' – tsikov

2

Penso acts_as_ferret plug sarebbe perfetto per le vostre esigenze, questo plugin permette di configurare facilmente gli indici molto cool come

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 } 
          } 
          } 
         }) 

Tutti gli indici acts_as_ferret sono configurati in un unico file, RAILS_ROOT/config/aaf.rb

+0

Non solo furetto. Anche la Sfinge-pensiero di Sfinge si integra bene con l'AR. In generale, l'utilizzo del software di indicizzazione full-text è una buona idea. – skalee

+0

Ferret è un tipo di dolore nella parte posteriore. È lento, è incline a indicizzare la corruzione e non ho avuto altro che problemi con esso. pensare-sfinge è la strada da percorrere. –

2

Se si sta distribuendo a Heroku o non dispiace cadere db agnosticismo, Postgres ha il pieno supporto di ricerca testuale. Non è necessario eseguire un servizio aggiuntivo. Inoltre, PG è il miglior database del SO. http://tenderlove.github.com/texticle/

Problemi correlati