Ruby コアから Timeout を使用して ActiveRecord クエリをタイムアウトさせたいのですが、ActiveRecord が例外をキャッチしTimeout::Error
てラップしているようActiveRecord::StatementInvalid
です。
> Timeout::timeout(3) { sleep 4000 }
Timeout::Error: execution expired
...
> Timeout::timeout(3) { ActiveRecord::Base.connection.execute "select pg_sleep(4)"}
(3001.5ms) select pg_sleep(4)
: execution expired: select pg_sleep(4)
ActiveRecord::StatementInvalid: : execution expired: select pg_sleep(4)
...
ActiveRecord::StatementInvalid
例外を生成する実際の SQL エラーをキャッチし、それらを別の方法で処理したいので、これは残念です。2つを区別する方法はありますか? (「実行期限切れ」の例外メッセージに一致するよりもクリーンです)。