Подтвердить что ты не робот

Используйте LIKE/regex с переменной в mongoid

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

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

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

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

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

Спасибо заранее.

4b9b3361

Ответ 1

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

или

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

Ответ 2

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

Вместо

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

@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