Вам нужно удвоить это \
, чтобы получить \w
до движка регулярных выражений, а затем вам нужно удвоить каждое из них, чтобы они прошли обработку строкового литерала в Ruby.И вы должны использовать E''
, чтобы избежать предупреждения.Кроме того, вам не нужен этот дополнительный SELECT, вы можете напрямую сравнить возвращаемое значение regexp_matches
.Итак, что-то вроде этого должно работать:
inner join ... and regexp_matches(patent.us_class_current, E'(\\\\w+)/') = array['D02']
Нет необходимости избегать косой черты в регулярном выражении PostgreSQL, поэтому я тоже это исключил.Встраивание языка (regex) в язык (SQL PostgreSQL) внутри другого языка (Ruby) имеет тенденцию становиться немного запутанным, когда все они хотят использовать один и тот же управляющий символ.
Например, в psql
этипроисходят вещи:
psql=> select regexp_matches('D03/pancakes', E'(\w+)/');
regexp_matches
----------------
(0 rows)
psql=> select regexp_matches('D03/pancakes', E'(\\w+)/');
regexp_matches
----------------
{D03}
(1 row)
psql=> select regexp_matches('D03/pancakes', E'(\\w+)/') = array['D03'];
?column?
----------
t
(1 row)
А затем с консоли Rails:
> ActiveRecord::Base.connection.select_rows(%q{select regexp_matches('D03/pancakes', E'(\w+)/')})
(0.5ms) select regexp_matches('D03/pancakes', E'(\w+)/')
=> []
> ActiveRecord::Base.connection.select_rows(%q{select regexp_matches('D03/pancakes', E'(\\w+)/')})
(1.9ms) select regexp_matches('D03/pancakes', E'(\w+)/')
=> []
> ActiveRecord::Base.connection.select_rows(%q{select regexp_matches('D03/pancakes', E'(\\\\w+)/')})
(0.4ms) select regexp_matches('D03/pancakes', E'(\\w+)/')
=> [["{D03}"]]
> ActiveRecord::Base.connection.select_rows(%q{select regexp_matches('D03/pancakes', E'(\\\\w+)/') = array['D03']})
(1.4ms) select regexp_matches('D03/pancakes', E'(\\w+)/') = array['D03']
=> [["t"]]