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に反映させて欲しいです。