Ruby on rails 我可以添加一列并同时为其编制索引吗?

Ruby on rails 我可以添加一列并同时为其编制索引吗?,ruby-on-rails,ruby-on-rails-3,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 add_index :users, :username, :unique =>

我运行了以下迁移:

rails generate migration add_username_to_users username:string 
class AddUsernameToUsers < ActiveRecord::Migration
  def change
    add_column :users, :username, :string, :unique => true
    add_index :users, :username, :unique => true
  end
end
然后我尝试了两种方法来增加它的独特性:

class AddUsernameToUsers < ActiveRecord::Migration
  def change
    add_column :users, :username, :string, :unique => true
  end
  # or add_index :users, :username, :unique => true
end
class AddUsernameToUserstrue
结束
#或者添加索引:users,:username,:unique=>true
结束

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

没有
:unique
选项,因此
:unique=>true
处于启用状态

add_column :users, :username, :string, :unique => true
被忽略了。在一次迁移中,您可以同时完成两件事,因此只需将您的
add_index
添加到您的AddUsernameToUsers迁移中即可:

rails generate migration add_username_to_users username:string 
class AddUsernameToUsers < ActiveRecord::Migration
  def change
    add_column :users, :username, :string, :unique => true
    add_index :users, :username, :unique => true
  end
end
class AddUsernameToUserstrue
添加索引:users,:username,:unique=>true
结束
结束

没有
:unique
选项,因此启用
:unique=>true

add_column :users, :username, :string, :unique => true
被忽略了。在一次迁移中,您可以同时完成两件事,因此只需将您的
add_index
添加到您的AddUsernameToUsers迁移中即可:

rails generate migration add_username_to_users username:string 
class AddUsernameToUsers < ActiveRecord::Migration
  def change
    add_column :users, :username, :string, :unique => true
    add_index :users, :username, :unique => true
  end
end
class AddUsernameToUserstrue
添加索引:users,:username,:unique=>true
结束
结束

您也可以使用
change\u table
方法,如下所示

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

使用
change\u table
的优点是,对于mysql,您可以传递
:bulk=>true
,它生成一条
ALTER table
sql语句,因此对于大型表来说速度更快(因为每次执行ALTER table时,mysql都会有效地复制整个表)

您也可以使用
change\u table
方法,如下所示

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

使用
change\u table
的优点是,对于mysql,您可以传递
:bulk=>true
,它生成一条
ALTER table
sql语句,因此对于大型表来说速度要快得多(因为mysql在每次执行ALTER table操作时都会有效地复制整个表)

Mu已经回答了,但供将来参考,当事情不起作用时,包括“不起作用”的症状是什么是很有帮助的。穆已经回答了,但为了将来参考,当事情不起作用时,包括“不起作用”的症状是什么是很有帮助的。