2011-12-15 13 views
21

Sto cercando di trovare tutti i documenti il ​​cui testo contiene la parola test. Il sotto funziona bene:Usa LIKE/regex con variabile in mongoid

@tweets = Tweet.any_of({ :text => /.*test.*/ }) 

Tuttavia, voglio essere in grado di cercare una stringa fornita dall'utente. Ho pensato che il seguito avrebbe funzionato ma non è così:

searchterm = (params[:searchlogparams][:searchterm]) 
@tweets = Tweet.any_of({ :text => "/.*"+searchterm+".*/" }) 

Ho provato tutto quello che mi veniva in mente, qualcuno sa che cosa potrei fare per fare questo lavoro.

Grazie in anticipo.

+0

penso che si dovrebbe aggiungere "i" alla fine c'è /.*test.*/i a fare quel lavoro senza essere maiuscole e minuscole. –

risposta

22
searchterm = (params[:searchlogparams][:searchterm]) 
@tweets = Tweet.any_of({ :text => Regexp.new ("/.*"+searchterm+".*/") }) 

o

searchterm = (params[:searchlogparams][:searchterm]) 
@tweets = Tweet.any_of({ :text => /.*#{searchterm}.*/ }) 
+0

Cosa devo fare se voglio cercare come c'è posizione Mumbai e io sto passando il luogo come Mumbai, Maharashtra, India.Ma non è la ricerca .. ecco la mia query Event.any_of (posizione: /.*mumbai maharashtra. */is) .entries. Non funziona, ma se Passo una Mumbai quindi sta funzionando.Si suggerisca –

+0

Questo ha funzionato per me – fmquaglia

15

Non c'è niente di sbagliato nella query di regex di mongodb. Il problema è passare la variabile alla stringa regex di ruby. Non è possibile combinare stringa con espressioni regolari come stringhe normali

Invece

"/.*"+searchterm+".*/" 

provare questo

>>searchterm = "test" 
    >>"/#{searchterm}/" 
    >> "/test/" 
+4

Grazie mille, Ramesh. Ho dovuto rimuovere il "all'inizio e alla fine e poi il tuo esempio ha funzionato perfettamente." Brilliant! – Hinchy

+0

contento che abbia aiutato :) – RameshVel

+0

Non è vulnerabile all'iniezione di codice dannoso? – Aleksey

0

Questo lavorato per me facendo:

Model.find(:all, :conditions => {:field => /regex/i}) 
0
@tweets = Tweet.any_of({ :text => Regexp.new ("/.*"+searchterm+".*/") }) 

è il lavoro, ma nessun risultato

@tweets = Tweet.any_of({ :text => Regexp.new (".*"+searchterm+".*") }) 

è ok e hanno seguito

@tweets = Tweet.any_of({ :text => /.*#{searchterm}.*/ }) 

è il lavoro, nessun risultato

La mia versione mongoid è 3.1.3 e la versione ruby ​​è 1 .9.3

1
@tweets = Tweet.any_of({ :text => Regexp.new (".*"+searchterm+".*") }) 

è ok e hanno seguito