У меня есть идентификаторы 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])
}
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, поэтому вы не должны расстраиваться по этому поводу.
Способ сделать $ where в mongoid использует Criteria#for_js
Что-то вроде этого
Model.for_js("new RegExp(number).test(this.int_field)", number: 763)
Похожие вопросы
Связанные вопросы
Новые вопросы
ruby
Ruby - это многоплатформенный динамический объектно-ориентированный интерпретируемый язык с открытым исходным кодом. Тег [ruby] предназначен для вопросов, связанных с языком Ruby, включая его синтаксис и его библиотеки. Вопросы Ruby on Rails должны быть помечены [ruby-on-rails].