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

为了获得invoice_number是纯数字的所有工作,我做:

 Job.where("invoice_number REGEXP '^[[:digit:]]+$'") 

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

一种方法是

 Job.all.select{|j| j =~ /^\d+$/} 

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

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

  named_scope :all_digits, lambda { |regex_str| { :condition => [" invoice_number REGEXP '?' " , regex_str] } } 

然后你有Job.all_digits

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

你最好的选择是Regexp#tos或Regexp#source或Regexp#inspect 。

但是我想不出你为什么要这么做 – Ruby不能轻易地以编程方式编写Regexp (这是我能想到为什么人们想要在一个层面上编写并提交它的唯一原因到另一个)。

我们可以这样写

 scope :only_valid_email_record , :conditions=>["email_id ~ ?","^([a-zA-Z0-9_.'-])+@(([a-zA0-9-])+.)+([a-zA-Z0-9]{2,4})+$"] 

它在轨道3中工作正常。