Подтвердить что ты не робот

Как указать регулярное выражение Ruby при использовании Active Record in Rails?

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

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

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

4b9b3361

Ответ 1

Один из способов -

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

Лучше всего либо Regexp # tos или Regexp # source или Проверить Regexp #.

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

Ответ 3

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

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

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