如何在Rails中使用Active Record时指定Ruby正则表达式?

Mis*_*hko 13 regex mysql activerecord ruby-on-rails ruby-on-rails-3

为了得到所有invoice_number纯数字的工作我做:

Job.where("invoice_number REGEXP '^[[:digit:]]+$'")
Run Code Online (Sandbox Code Playgroud)

是否可以通过在Ruby而不是MySQL中指定正则表达式来做同样的事情?

Mar*_*mas 12

一种方法是

Job.all.select{|j| j =~ /^\d+$/}
Run Code Online (Sandbox Code Playgroud)

但它不如MySQL版本那么高效.

另一种可能性是使用命名范围来隐藏丑陋的SQL:

  named_scope :all_digits, lambda { |regex_str|
    { :condition => [" invoice_number REGEXP '?' " , regex_str] }
  }
Run Code Online (Sandbox Code Playgroud)

那你有Job.all_digits.

请注意,在第二个示例中,您正在组装数据库的查询,因此regex_str需要是一个MySQL正则表达式字符串而不是Ruby Regex对象,它具有略微不同的语法.