Используйте LIKE / regex с переменной в mongoid - PullRequest
22 голосов
/ 15 декабря 2011

Я пытаюсь найти все документы, текст которых содержит слово test.Ниже работает нормально:

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

Тем не менее, я хочу иметь возможность поиска строки, предоставленной пользователем.Я думал, что ниже будет работать, но это не так:

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

Я перепробовал все, что мог придумать, кто-нибудь знает, что я мог сделать, чтобы сделать эту работу.

Спасибо ввперед.

Ответы [ 5 ]

27 голосов
/ 15 декабря 2011
searchterm = (params[:searchlogparams][:searchterm])
@tweets = Tweet.any_of({ :text => Regexp.new ("/.*"+searchterm+".*/") })

или

searchterm = (params[:searchlogparams][:searchterm])
@tweets = Tweet.any_of({ :text => /.*#{searchterm}.*/ })
15 голосов
/ 15 декабря 2011

В запросе mongodb regex нет ничего плохого.Проблема заключается в передаче переменной в строку ruby ​​regex.Вы не можете смешивать строку с регулярным выражением, как обычные строки

Вместо

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

Попробуйте это

  >>searchterm = "test"
  >>"/#{searchterm}/"
  >> "/test/" 
1 голос
/ 22 октября 2013
@tweets = Tweet.any_of({ :text => Regexp.new (".*"+searchterm+".*") })

в порядке и имеет результат

0 голосов
/ 16 мая 2013
@tweets = Tweet.any_of({ :text => Regexp.new ("/.*"+searchterm+".*/") })  

это работа, но без результата

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

в порядке и имеет результат

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

это работа, без результата

Моя версия mongoid - 3.1.3, а версия ruby ​​- 1.9.3

.
0 голосов
/ 09 июля 2012

Это сработало для меня, сделав:

Model.find(:all, :conditions => {:field => /regex/i})
...