Используйте LIKE/regex с переменной в mongoid
Я пытаюсь найти все документы, текст которых содержит тест слова. Нижеследующее прекрасно работает:
@tweets = Tweet.any_of({ :text => /.*test.*/ })
Однако я хочу иметь возможность искать строку, предоставленную пользователем. Я думал, что ниже будет работать, но это не так:
searchterm = (params[:searchlogparams][:searchterm])
@tweets = Tweet.any_of({ :text => "/.*"+searchterm+".*/" })
Я пробовал все, что мог придумать, кто-нибудь знает, что я могу сделать, чтобы сделать эту работу.
Спасибо заранее.
Ответы
Ответ 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