Railsのマイグレーションで複合キーのインデックスを貼る作業をした。
対象のRDBMSはMySQLでしかも、複合キーとなるカラムにTEXTがあったので、lengthを指定しなければいけなかった。
SQLで書くとこんな感じ。
ALTER TABLE target_table ADD INDEX additional_idx01(
long_text(255) ,
saved_on
)
これによると、複合キーの場合のインデックスの追加は
add_index :target_table, [:long_text, :saved_on], :name => 'additional_idx01'
で、いけるらしい。
しかし、これでは長さが指定出来ないので、migrateでSQLエラーが発生する。
ドキュメントでインデックスの長さを指定する例を見てみると
add_index :users, :name, :name => 'by_name', :length => 10
と、書いてある。長さはオプションで指定するらしいのだが、このままだとカラム全体に長さ制限が掛かってしまう。
試しに、以下のように書いてみたがもちろんSQLエラー。
add_index :target_table, [:long_text, :saved_on], :name => 'additional_idx01', :length => 255
散々悩んで、WEBをあさりまくったら、英語圏のブログに解決策を書いているおっさんがいた。感謝感謝。
結局解決した記述。
add_index :target_table, [:long_text, :saved_on], :name => 'additional_idx01', :length => {:long_text => 255}
こんなん想像つくかーーーー!!!!
最初、第2引数に配列が書けるだけでもショックだったのに、オプションの指定で値ではなくハッシュが渡せるなんて。Ruby界隈の人はこれは当たり前なんだろうか。