Как указать Ruby regex при использовании Active Record в Rails?

чтобы получить все задания, которые invoice_number это чистое число, которое я делаю:

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

можно ли сделать то же самое, указав регулярное выражение в Ruby, а не MySQL ?

3 ответов


один из способов-это

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, который имеет немного другой синтаксис.


ваш лучший выбор-это либо регулярное выражение#tos или Regexp#source или Regexp#inspect.

но я не могу понять, почему вы хотите это сделать-Ruby не позволяет легко сочинять Regexps программно (это единственная причина, по которой я могу подумать, почему можно захотеть сочинять на одном уровне и отправлять его на другой).


мы можем записать как

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

он отлично работает в rails 3.