2011-12-29 56 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

穆的已經回答了,但爲了將來的參考,當事情不起作用時,包括什麼「不工作」的症狀是有幫助的。 – 2011-12-29 04:00:37

回答

4

沒有爲add_column所以:unique => true沒有:unique選項上

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 sql語句,因此對於大型表格更爲快捷(因爲每次您執行alter table時,mysql都會有效地複製整個表格)

相關問題