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

2024-01-14

我有一些身份证214001, 214002, 215001, etc...

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

“214”应该触发 ID 自动完成214001, 214002

显然,我不能只是做一个

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

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

This question https://stackoverflow.com/questions/2908100/mongodb-regex-search-on-integer-value有一些线索,但我怎样才能在 Rails 中做到这一点?

EDIT:上下文是能够通过其整数 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)")

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

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

您最好使用字符串字段,以便可以进行正常的正则表达式匹配。我非常确定,如果您也在开始时锚定正则表达式,MongoDB 将能够使用索引。如果您确实需要它成为数据库中的数字,那么您始终可以将其存储为整数和字符串字段:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

整数字段上的 Rails mongoid 正则表达式 的相关文章

随机推荐