Как указать 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 не позволяет легко сочинять Regexp
s программно (это единственная причина, по которой я могу подумать, почему можно захотеть сочинять на одном уровне и отправлять его на другой).
мы можем записать как
scope :only_valid_email_record , :conditions=>["email_id ~ ?","^([a-zA-Z0-9_.'-])+@(([a-zA0-9-])+.)+([a-zA-Z0-9]{2,4})+$"]
он отлично работает в rails 3.