2012-03-27 8 views
1

PostgresでSQLコンソール/ツールからはうまく動作しますが、RailsのActiveRecord(ActiveRecord :: Base.connection.execute /すべて選択)。 ActiveRecord :: Base.quote/sanitizeを使用しないで引用符をエスケープするようなものを試しました。ActiveRecordは、このクエリで返されたタプルを確認した空のセットを返します。SQLクエリ(Postgres)は正常に動作しますが、ActiveRecordでは動作しません

SELECT 
     ... blah blah 
     FROM 
       ... joins joins joins 
       inner join core.pat_assignments assignment on assignment.correspondent_alias_id = out_alias.id 
       inner join core.pats patent on patent.id = assignment.pat_id and (select regexp_matches(patent.us_class_current, '(\w+)\/')) = '{D02}' 
     where 
       in_alias.id in (1987, 5004) 

面白いことに、それは私が取る場合は、最後のインナーはライン、特に正規表現マッチに参加する何かを返し、です。そうで何かがあります:それは投げる作って

(select regexp_matches(patent.us_class_current, '(\w+)\/')) = '{D02}' 

は、しかし、任意の提案をいただければ幸いですなぜ...私はちょうど把握することはできません!

+0

ルック。バリアントの結果である実際のSQLが表示されます。彼らがどのように違うのか分からない場合は、違いを記入してください(実際のものではなく、「ああ、まったくありません:-)」。 –

答えて

3

\を2倍して\wを正規表現のエンジンに合わせる必要があります。その後、それらをそれぞれ2倍してRubyの文字列リテラル処理を超えなければなりません。また、警告を避けるには、E''を使用する必要があります。また、余分なSELECTを必要としないので、regexp_matchesの戻り値を直接比較することができます。だから、このようなものは動作するはずです:

inner join ... and regexp_matches(patent.us_class_current, E'(\\\\w+)/') = array['D02'] 

私もそれを取ったので、PostgreSQLの正規表現ではスラッシュをエスケープする必要はありません。他の言語(Ruby)の言語(PostgreSQLのSQL)に言語(正規表現)を埋め込むことは、同じエスケープ文字を使いたいときに少しばかり気になる傾向があります。例えば

は、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のコンソールから:development.logファイルで

> 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"]] 
関連する問題