代码之家  ›  专栏  ›  技术社区  ›  Cyril Duchon-Doris

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

  •  1
  • Cyril Duchon-Doris  · 技术社区  · 9 年前

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

    在搜索栏中,我希望使用ID自动完成

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

    显然,我不能只做一个

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

    与猫鼬。有人知道用正则表达式匹配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])
    }
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   mu is too short    9 年前

    链接问题的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 变化。如果这样做,模式匹配范围将看到 :数字_秒 .像这样的预计算和复制数据在MongoDB中很常见,因此您不必为此感到难过。

        2
  •  0
  •   Ismael Abreu    9 年前

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

    像这样的东西

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