我可以同时添加一列并对其进行索引吗?

时间:2011-12-29 03:29:13

标签: ruby-on-rails ruby-on-rails-3

我运行了以下迁移:

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

但这对我不起作用。我知道我可以运行另一个迁移来添加索引,但我想知道在添加列时是否可以编制索引?这样我就可以将迁移量保持在最低限度。

2 个答案:

答案 0 :(得分:4)

add_column没有:unique选项,因此: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 :(得分: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语句,因此对于大型表来说更快(因为mysql有效地复制了整个每次你做一个转换表时表格)