2011-12-29 4 views
1

Я побежал следующий переход:Могу ли я добавить столбец и проиндексировать его одновременно?

rails generate migration add_username_to_users username:string 

А потом я попробовал два способа добавить уникальности к нему:

class AddUsernameToUsers < ActiveRecord::Migration 
    def change 
    add_column :users, :username, :string, :unique => true 
    end 
    # or add_index :users, :username, :unique => true 
end 

Но это не работает для меня. Я знаю, что я могу запустить еще одну миграцию, чтобы добавить индекс, но я хотел знать, можно ли индексировать, когда вы добавляете столбец? Таким образом, я могу свести количество миграций к минимуму.

+0

Му уже ответил, но для справок в будущем, когда что-то не работает, полезно включить то, что симптомы «не работают». –

ответ

4

Там нет :unique варианта для add_column так в :unique => true на

add_column :users, :username, :string, :unique => true 

игнорируются. Вы можете сделать две вещи сразу в одной миграции, хотя так просто добавить add_index к вашей AddUsernameToUsers миграции:

class AddUsernameToUsers < ActiveRecord::Migration 
    def change 
    add_column :users, :username, :string, :unique => true 
    add_index :users, :username, :unique => true 
    end 
end 
1

Вы также можете использовать метод change_table, как так

class AddUsernameToUsers < ActiveRecord::Migration 
    def change 
    change_table(:users) do |t| 
     t.string :username 
     t.index :username, :unique => true 
    end 
    end 
end 

Преимущество использования change_table - это то, что для mysql вы можете пройти :bulk => true, который генерирует одиночный оператор ALTER TABLE и, следовательно, намного быстрее для больших таблиц (поскольку mysql эффективно копирует всю таблицу каждый раз, когда вы делаете таблицу изменений)

Смежные вопросы