Rails SQL regular expression
On Rails 4+ with a Postgres database the general form of a RegEx query is:
Model.where("column ~* ?", 'regex')
As for the regex, it can be a general '^A\d+$'
or more specific '^A\d{4}$'
Breaking it down:
^ - string start anchorA - literal "A"\d+ - one or more digits (0-9)\d{4} - exactly four digits$ - string end anchor
Basically, the regex reads "the string should start with an A, followed by four digits and then the string should end".The final query line is:
@max_draw = Drawing.where("drawing_number ~* ?", '^A\d{4}$')
Further reading on ruby RegEx at RubyDoc or the more accessible Perl variant (used by Sublime text)
You did a good job! The thing missing was the REGEXP
function which is used for regex in queries:
So in your case use
Drawing.where("drawing_number REGEXP ?", 'A\d{4}')# the {4} defines that there have to be exactly 4 numbers, change if you need to
In SQL you use the '-colons
, which is weird because you normally start regex with /-backslashes
You can't use regular expressions in SQL which is what you're trying to do. Your best bet would be to select just the entries that start with A like your original code, then skip entries that have more than one letter at the beginning.
items = Drawing.where( [ 'drawing_number LIKE ?' , 'A%' ] )max_value = 0items.each do |item| next if item.drawing_number =~ /\A[A-Za-z]{2,}/ drawing_number = item.drawing_number.gsub(/\AA/, '').to_i max_value = drawing_number if drawing_number > max_valueend
I'm reasonably certain it's possible to get this shorter but this should do what you need.
(\A is the start of line anchor that works with strings containing newlines)
({2,} matches two or more of the proceeding character range)
http://www.rubular.com/ is awesome for testing ruby regexes.