2011-12-29 3 views
1

私は、次の移行走っ:列を追加して同時に索引付けすることはできますか?

rails generate migration add_username_to_users username:string 

をそして私はそれに一意性を追加するには2つの方法を試みた:

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

をしかし、これは私のために動作しませんでした。別の移行を実行してインデックスを追加することはできますが、列を追加するときにインデックスを作成できるかどうかを知りたがっていますか?このようにして、移行の量を最小限に抑えることができます。

+0

ムーはすでに答えられていますが、将来の参考として、うまくいかないときは、「働いていない」という症状が何であるかを含めると便利です。 –

答えて

4

は無視され

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

にそう:unique => trueadd_columnには:uniqueオプションはありません。そう、ちょうどあなたのAddUsernameToUsersの移行にごadd_indexを追加してもあなたは、単一の移行を一度に2つのことを行うことができます。

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

をまた使用するので

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

利点のように、change_table方法を使用することができますchange_tableは、mysqlの場合、:bulk => trueを渡すことができます。ALTER TABLEのSQL文を生成するので、大きなテーブルのほうがはるかに速くなります(mysqlはalter tableを実行するたびにテーブル全体を効果的にコピーします)

関連する問題