Rails 整数字段上的 mongoid 正则表达式
Rails mongoid regex on an Integer field
我有一些ID214001, 214002, 215001, etc...
在搜索栏中,我希望使用 ID
自动完成
“214”应触发 ID 214001
、214002
的自动完成
显然,我不能只做
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 中很常见,所以你不应该为此感到难过。
我有一些ID214001, 214002, 215001, etc...
在搜索栏中,我希望使用 ID
自动完成“214”应触发 ID 214001
、214002
显然,我不能只做
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 中很常见,所以你不应该为此感到难过。