Как указать регулярное выражение Ruby при использовании Active Record в Rails? - PullRequest
13 голосов
/ 09 ноября 2011

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

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

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

Ответы [ 3 ]

12 голосов
/ 09 ноября 2011

В одну сторону

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

2 голосов
/ 09 ноября 2011

Ваша лучшая ставка - либо Regexp # tos , либо Regexp # source или Regexp # inspect .

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

1 голос
/ 10 декабря 2013

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

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

Отлично работает в рельсах 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...