2011-12-15 28 views
21

Estoy tratando de encontrar todos los documentos cuyo texto contenga la palabra prueba. El siguiente funciona bien:Usar LIKE/regex con variable en mongoid

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

Sin embargo, quiero ser capaz de buscar una cadena suministrada por el usuario. Pensé que el siguiente iba a funcionar pero no es así:

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

He intentado todo lo que podía pensar, alguien sabe lo que podría hacer para hacer este trabajo.

Gracias de antemano.

+0

creo que debería añadir "i" al final hay /.*test.*/i para hacer que el trabajo sin ser sensible a mayúsculas. –

Respuesta

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

Lo que tengo que hacer si quiero buscar como si hubiera ubicación Mumbai y estoy pasando la ubicación como Mumbai, Maharashtra, India. Pero no está buscando ... aquí está mi consulta Event.any_of (ubicación: /.*mumbai maharashtra. */is) .entries. No funciona, pero si Paso un mumbai y luego funciona. Sugerí que lo haga. –

+0

Esto funcionó para mí – fmquaglia

15

No hay nada de malo en la consulta de expresiones regulares de mongodb. El problema es pasar variable a ruby ​​regex string. No se puede mezclar cadena con expresiones regulares como cadenas normales

lugar

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

probar esto

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

Muchas gracias, Ramesh. Tuve que eliminar el "al principio y al final y luego tu ejemplo funcionó perfectamente. Genial! – Hinchy

+0

me alegro de que haya ayudado :) – RameshVel

+0

¿No es vulnerable a la inyección de código malicioso? – Aleksey

0

Este trabajado para mí haciendo:

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

es trabajo, pero sin resultado

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

está bien y tienen resultado

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

es el trabajo, ningún resultado

Mi versión mongoid es 3.1.3 y la versión ruby ​​es 1 .9.3

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

está bien y tienen resultado