Railsのvalidates_uniqueness_ofで大文字小文字の区別

Railsのヴァリデーションの宣言的な記述は非常にかっこいい。かっこいい一方バグるとはまるはまる。すごくはまる。

今日は、validates_uniqueness_ofのプロパティでcase_sensitiveをtrueにしてもfalseにしても、大文字小文字の区別がつかなくて長時間悩みました。case_sensitiveはデフォルトでtrueだからfalseにすれば区別されるはずだよなあ、いやおかしいされない、というか意味的にはtrueだとされるはずだよな、おかしいおかしい。

悩みつついろいろぐぐってみると、どうやらMySQLが悪い模様。varchar型は標準では大文字小文字の区別をしないようです。区別を付けるにはbinary属性を付けなければならないようですが、Railsのmigratationではbinary属性に対応していません。

http://ishikawa.developer.drecom.jp/blog/articles/rails-migration-mysql-binary-attribute-support

上のページに解決策が書かれているけれども、面倒だなあ。migrationを使うのがそもそもの間違いだったのでしょうか…。

いやmigrationがスマートであるというのはすごく良くわかります。しかしそれゆえに中途半端なのは気に障る。いや、SQLよりはスマートとはいえ、やっぱりまだまだmigrationの考え方が根本的に中途半端な気もします。スキーマ構造はmodelに定義して、modelに変更があったら、自動的にその変更をDBに反映させて欲しいです。