2010-12-15 4 views
0

У меня есть элемент модели с индексированным полем с именем _key, то есть массив строк (ключевые слова для поиска). Теперь мне нужно сделать автозаполнение для этой модели (через JSON) в другой форме, и проблема в том, что вместо точного поиска всеми словами, введенными пользователем, мне нужно делать точный поиск всеми, кроме одного последнего слова. Так что я сделал это прицелами в этой модели:Проблема MongoID и multikey query

scope :find_by_keywords, lambda { |keys| where(:_keys.all => keys) } 
scope :for_autocomplete, lambda { |keys| where(:_keys.all => keys[0..-2], :_keys => /^#{keys[-1]}/i) } 

первый простор для точного поиска работает хорошо, но у меня есть проблемы со второй рамкой для автозаполнения. Mongoid оптимизирует (или что-то подобное) этот запрос, поэтому он становится

db_development['items'].find({:_keys=>/^qwer/i}, {}) 

т.е. он не попадает в ВСЕГДА первое условие. Это неудивительно, потому что для разных условий нужны разные критерии поля. Так что я попробовал много-много вариантов. Различные комбинации .all и .in, разделенные на разные методы «wheres», «all_in», «find (: conditions => ...)» и т. Д. Не могли бы вы предложить, как я могу сделать эту работу?

ответ

0

Я нашел такое решение:

область применения: for_autocomplete, лямбда {| ключи | где (: _ keys.all => keys [0 ..- 2] + [/^# {keys [-1]} /])}

Кажется, что работает.

Смежные вопросы