2013-10-23 12 views
5

Desidero ottenere tutti i profili con i nomi dei soggetti che corrispondono alla parola chiave di ricerca. in questo momento sto caricando tutti i profili. ho bisogno di sapere come ottenerlo. Ogni aiuto è molto apprezzato.come cercare attraverso le associazioni nei binari 4

Profile.rb

has_many :categorizations 
has_many :subjects, through: :categorizations 

Subject.rb

has_many :categorizations 
has_many :profiles, through: :categorizations 

Categorization.rb

belongs_to :profile 
belongs_to :subject 

views/ricerca/index.html.erb

# search form 
<%= form_tag search_index_path, :method => 'get' do %> 
    <%= text_field_tag :search, params[:search] %> 
    <%= submit_tag "search", :name => nil %> 
<% end %> 

# search results 
<% @profiles.each do |profile| %> 
    <%= profile.name %> 
<% end %> 

search_controller.rb

def index 
    @profiles = Profile.with_translations('en').all 
end 
+1

avete bisogno della la ricerca per parole chiave corrispondere esattamente al profilo soggetto? – Teddy

+0

non esattamente, se il nome del soggetto ha una corrispondenza di parole rispetto a quelle dei profili di ricerca nei risultati di ricerca. – Murtza

risposta

4

Qualcosa da aggiungere a questo è l'idea di full text searching con Rails. Se si sta eseguendo ricerche, è necessario essere consapevoli del fatto che si sta effettivamente eseguendo un testo completo "cercare" query in vostro DB, che è diverso a seconda del motore SQL si utilizza


MYSQL testo completo Ricerca

Il meccanismo LIKE %{search}% è la funzione di ricerca di testo completo di base di MYSQL e cerca fondamentalmente la query di destinazione nell'intero record nel DB. Questo significa che se la query è questa:

SELECT * FROM `products` WHERE `name` LIKE '%alligator%' 

MYSQL sarà essenzialmente guardare attraverso l'intero record "nome" per ogni riferimento alla tua richiesta. I risultati saranno basati sul fatto che il tuo record abbia la parola "alligatore" in qualsiasi parte di esso. This reference spiega un po 'di più su questo


PostgreSQL ricerca full-text

La ragione per cui ho scritto questo post è perché PSQL realmente fa in modo diverso, e quindi la query v'è stato fornito funziona solo per MySQL .PSQL ha un sacco di diverse funzioni per gestire la ricerca full text, ma dato che usiamo Heroku, siamo riusciti a usare il Textacular gem per ottenere tutto funziona correttamente

Qui sono some ways PSQL handles full text searching:

Full text searching in PostgreSQL is based on the match operator @@, which returns true if a tsvector (document) matches a tsquery (query). It doesn't matter which data type is written first:

SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector @@ 'cat & 
rat'::tsquery; ?column? 
---------- t 

SELECT 'fat & cow'::tsquery @@ 'a fat cat sat on a mat and ate a fat 
rat'::tsvector; ?column? 
---------- f 

As the above example suggests, a tsquery is not just raw text, any more than a tsvector > is. A tsquery contains search terms, which must be already-normalized lexemes, and may combine multiple terms using AND, OR, and NOT operators. (For details see Section 8.11.) There are functions to_tsquery and plainto_tsquery that are helpful in converting user-written text into a proper tsquery, for example by normalizing words appearing in the text. Similarly, to_tsvector is used to parse and normalize a document string. So in practice a text search match would look more like this:

SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat'); ?column? 
---------- t Observe that this match would not succeed if written as 

SELECT 'fat cats ate fat rats'::tsvector @@ to_tsquery('fat & rat'); ?column? ---------- f


Software di ricerca testo completo

La ricerca di testo completo è intrinsecamente piuttosto costosa sul DB, soprattutto se si dispone di molti dati da cercare. Ecco perché esistono soluzioni come sunspot solr o sphinx - per fornire un modo per entrambi indice & cercare i dati che avete

Se l'applicazione diventa abbastanza popolare, si potrebbe desiderare di investire in uno dei sistemi di ricerca full-text, come ad esempio these demonstrated by Heroku:

Heroku's full text search packages

+0

Grazie mille per una risposta così dettagliata ma in realtà sono nuovo rotaie e cercando di capire come faccio a cercare le associazioni ma ho trovato la tua risposta come una buona opzione e lasciami provare su una nuova applicazione. Sto provando con macchie solari vedendo il railscast di Ryan. – Murtza

+2

Nessun problema! Se sei nuovo ai binari, in realtà non consiglierei di implementare la ricerca di testo completo "hardcore" (ci vuole un po 'di lavoro per farlo funzionare).Quello che volevo fare era darti una definizione di ciò che stai effettivamente cercando di fare; invece di ottenere una query, avrai un set di funzionalità pronto per essere implementato quando perfezioni le tue abilità :) –

+1

Dopo alcuni giorni di pratica, utilizzo correttamente Sunspot gem. Grazie a te per la guida. ho una domanda, posso usare sunspot con gemma globalizzata? – Murtza

4
@profiles = Subject.where("name LIKE ?", "%#{params[:search]}%").map(&:profiles) 
+1

ottengo il seguente risultato "Mysql2 :: Errore: colonna sconosciuta 'profile_id' in 'lista campi': SELECT profile_id FROM' subject' WHERE (nome LIKE '%%') " – Murtza

+0

@Murtza ha aggiornato la mia risposta. – x3qt

+0

ora sto ottenendo "metodo non definito' nome_modello "per" e non stampa profile.name nei risultati. – Murtza

2

Verificare se questo funziona.

@profiles = Profile.joins(:subjects).where("subject.name like '%?%'",params[:search]) 
+0

No, non funziona e mi dà l'errore seguente "Mysql2 :: Errore: hai un errore nella sintassi SQL, controlla il manuale corrispondente alla versione del tuo server MySQL per la sintassi corretta da usare vicino a '%' '%)' alla riga 1: SELECT 'profiles'. * FROM' profiles' INNER JOIN 'categorizza' ON' categorizza'' .profile_id' = 'profiles'' .id' INNER JOIN' subject' ON 'subject''id' =' categorizzazioni' .subject_id' WHERE (subject.name like% ''%) " – Murtza

+1

@Murtza Modificato. Sostituisci anche 'params [: search]' con la tua query di ricerca – shiva

+0

che ho sostituito con una parola chiave "maths" ma mostra ancora lo stesso errore. – Murtza

Problemi correlati