Rails在Integer字段上使用mongoid regex



我有一些ID 214001, 214002, 215001, etc...

从搜索栏中,我想要ID 的自动完成

"214"应触发ID 214001214002 的自动完成

显然,我不能只做

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

与mongoid。有人知道用正则表达式匹配mongoid Integer字段的工作方法吗?

这个问题有一些线索,但我如何在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])
}

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

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

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

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

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

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

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

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

然后具有一些挂钩以在CCD_ 7改变时保持CCD_。如果您这样做,您的模式匹配范围将是:number_s。像这样的预计算和复制数据在MongoDB中很常见,所以你不应该对此感到不好。

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

像这样的

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

最新更新