Rails 4 + PostgreSQL inet型でprefix length付きIPアドレス(192.0.2.1/24)を保存する


Rails 4からActiveRecordがPostgreSQLのinet型に対応し、IPAddr型に自動的に変換してくれるようになった。しかしこのRuby標準のIPAddr型、プレフィックス長付きのIPアドレス(例えば192.0.2.1/24とか2001:db8::1/64とか)だとうまく扱えず、結果としてDBに正しく保存出来ない。

Railsのissueにも随分前からあがっている: https://github.com/rails/rails/issues/14857

が、未だに対応されてない。今やっているプロジェクトでどうしても必要だったので、とりあえずIPAddr型をCIDR表記に対応させるモンキーパッチを書いて対応した。ついでにGem化しておいた。
https://github.com/s2ugimot/ext_ipaddr

書き換えている内容は lib/ext_ipaddr.rb を見て頂ければ分かるのだが、コンストラクタでかなり怪しげな処理をして強引に対応させている。これでActiveRecord経由でのデータ取得や保存はちゃんとできているが、==もoverrideしてデフォルトから挙動を変更しているので、ちょっと複雑な処理に突っ込むと何かおかしくなるかもしれない。