Поскольку индексы MySQL уже нечувствительны к регистру, я предполагаю, что вы имеете дело с PostgreSQL, который по умолчанию создает регистрозависимые индексы. Я отвечаю здесь, основываясь на Rails 3.2.3 и PostgreSQL 8.4.
Кажется, функциональные индексы - это еще один пример того, что ActiveRecord не может сгенерировать. Внешние ключи и столбцы UUID - еще две, которые приходят на ум. Таким образом, нет другого выбора (кроме исправления обезьян ActiveRecord), кроме использования execute
операторов.
Это означает, что для точного дампа вашей базы данных вам нужно отказаться от DB-agnostic schema.rb в пользу DB-специфичной структуры.sql. См. Руководство по миграции на Rails, раздел 6.2 Типы дампов схемы . Это устанавливается следующим образом:
конфиг / application.rb
config.active_record.schema_format = :sql
db / structure.sql должен обновляться автоматически при запуске миграции. Вы можете создать его вручную с помощью этой команды:
rake db:structure:dump
Файл является чистым Postgres SQL. Хотя это не задокументировано, когда вы используете rake -T
для вывода списка задач rake, похоже, что вы можете использовать эту команду для загрузки базы данных из дампа структуры.sql:
rake db:structure:load
Здесь нет ничего волшебного: исходный код (показанный здесь из Rails 3.2.16) просто вызывает psql для структуры.sql.
Наконец, вот моя миграция, чтобы удалить старое, чувствительное к регистру ограничение электронной почты и добавить регистрозависимый функциональный индекс:
class FixEmailUniqueIndexOnUsers < ActiveRecord::Migration
def up
remove_index :users, :email
execute "CREATE UNIQUE INDEX index_users_on_lowercase_email
ON users USING btree (lower(email));"
end
def down
execute "DROP INDEX index_users_on_lowercase_email;"
add_index :users, :email, :unique => true
end
end