varcharのuser_idと戦うぼくらには
結論だけ申し上げると、数値以外の変な入力にマッチさせるには、正規表現でPOSIXクラスの[[:cntrl:]]
使えば良いです。
古いシステムでこの運用多くありません?
varcharでnull可な、user_id(´・ω・`)
文字列想定しているけど使われていない残念なケースです。多分。
今、私の仕事は古いサービスをモダンにリプレースするという仕事をやっているわけですが、でるわでるわDB的なアンチパターン。カラムが大量(40とか)にあるテーブルに、溢れ出す9本のインデックス。うん、これは大層つらい。
今回話すのは、地味に困ったuser_idの話です。旧システムの開発データにこんなのいました。
”12345\n6”
間に改行コード入ってるやーつ(´・ω・`)本番ではないデータな気はするのですが、伝承されている仕様が失伝しているため、確証持てず。
Ruby使って文字列から数値に変換するには、to_iというメソッドを使えばよいのですが、上の入力をto_iすると
”12345\n6”.to_i => 12345
改行した先にいる6が消える( ゚д゚)こまる。 単純に\nをgsubで置換しちまおうと思っていたのですが、他の制御文字のことを考えると微妙い対応になるんですよねぇ(´・ω・`)
で調べた結果、:cntrl:を正規表現でマッチさせればいいことを知ります。
とりあえずこれで解決。