Это код прямо из моего рабочего проекта:
add_index( :tickets, [:to_email, :body_hash, :from_email] , :unique => true, :limit => 255)
Обратите внимание, что функциональность limit требуется только в том случае, если вы используете уникальные текстовые поля (а не строки), хотя они еще не реализованы в рельсах (я полагаю, в 3.0) Вы можете обойти это ограничение, используя плагин mysql_index_length http://github.com/eparreno/mysql_index_length/
add_index( :table_name, [:column_name, :second_column_name, :third_column_name] , :unique => true, :limit => 255)
В этом примере создается уникальный индекс для трех столбцов, хотя вы можете использовать его для одного столбца, если хотите.
Ссылка на проект на GitHub: http://github.com/thinkbohemian/WhySpam/blob/master/db/migrate/20091223193335_add_unique_index.rb