Rails 整数字段上的 mongoid 正则表达式

Rails mongoid regex on an Integer field

我有一些ID214001, 214002, 215001, etc...

在搜索栏中,我希望使用 ID

自动完成

“214”应触发 ID 214001214002

的自动完成

显然,我不能只做

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

与mongoid。任何人都知道将 mongoid Integer 字段与正则表达式匹配的工作方式吗?

这个 question 有一些线索,但我怎样才能在 Rails 中做到这一点?

编辑 :上下文是能够通过其整数 ID 或其简短描述找到项目:

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])
}

在 mongoid 中做 $where 的方法是使用 Criteria#for_js

像这样

Model.for_js("new RegExp(number).test(this.int_field)", number: 763)

链接问题的 MongoDB 解决方案是:

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

你交给 find 的东西几乎一对一映射到 Mongoid:

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

对于这种有限的情况,to_i 调用应该可以进行字符串插值。

请记住,这对您的数据库来说是一件非常可怕的事情:它不能使用索引,它会扫描集合中的每个文档,...

您最好使用字符串字段,这样您就可以进行正常的正则表达式匹配。我很确定 MongoDB 将能够使用索引,如果你也在开始时锚定你的正则表达式。如果你真的需要它是数据库中的一个数字,那么你总是可以将它存储为整数和字符串字段:

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

然后有一些挂钩可以使 :number_s:number 发生变化时保持最新。如果这样做,您的模式匹配范围将查看 :number_s。像这样预先计算和复制数据在 MongoDB 中很常见,所以你不应该为此感到难过。