У меня есть идентификаторы 214001, 214002, 215001, etc...

В строке поиска я хочу автозаполнение с идентификатором

«214» должно вызвать автозаполнение для идентификаторов 214001, 214002

Видимо, я просто не могу

scope :by_number, ->(number){
    where(:number => /#{number.to_i}/i)
}

С монгоидом. Кто-нибудь знает рабочий способ сопоставления поля mongoid Integer с регулярным выражением?

В этом вопросе была некоторая подсказка, но как я могу сделать это внутри Rails?

РЕДАКТИРОВАТЬ : контекст позволяет найти проект по его целочисленному идентификатору или его краткому описанию:

scope :by_intitule, ->(regex){ 
    where(:intitule => /#{Regexp.escape(regex)}/i)
}
# TODO : Not working !!!!
scope :by_number, ->(numero){
    where(:number => /#{number.to_i}/i)
}
scope :by_name, ->(regex){ 
    any_of([by_number(regex).selector, by_intitule(regex).selector])
}
1
Cyril Duchon-Doris 1 Мар 2015 в 03:02

2 ответа

Лучший ответ

Решение MongoDB из связанного вопроса:

db.models.find({ $where: '/^124/.test(this.number)' })

Вещи, которые вы передаете find, в значительной степени однозначно соответствуют Mongoid:

where(:$where => "/^#{numero.to_i}/.test(this.number)")

Вызов to_i должен разрешить строковую интерполяцию в этом ограниченном случае.

Имейте в виду, что это довольно ужасная вещь, которую можно сделать с вашей базой данных: она не может использовать индексы, она будет сканировать каждый документ в коллекции, ...

Возможно, вам будет лучше использовать строковое поле, чтобы вы могли выполнять обычное сопоставление регулярных выражений. Я почти уверен, что MongoDB сможет использовать индекс, если вы также закрепите свое регулярное выражение в начале. Если вам действительно нужно, чтобы это было число внутри базы данных, вы всегда можете сохранить его как целое число, так и как поле String:

field :number,   :type => Integer
field :number_s, :type => String

А затем иметь несколько ловушек для обновления :number_s при изменении :number. Если вы это сделаете, ваша область сопоставления с образцом будет смотреть на :number_s. Подобные предварительные вычисления и дублирование данных довольно распространены в MongoDB, поэтому вы не должны расстраиваться по этому поводу.

2
mu is too short 1 Мар 2015 в 02:47

Способ сделать $ where в mongoid использует Criteria#for_js

Что-то вроде этого

Model.for_js("new RegExp(number).test(this.int_field)", number: 763)
0
Ismael Abreu 1 Мар 2015 в 03:22