142

假设我table在 Rails 应用程序中创建了一个表。一段时间后,我添加了一个运行的列:

rails generate migration AddUser_idColumnToTable user_id:string. 

然后我意识到我需要添加user_id为索引。我知道这个add_index方法,但是这个方法应该在哪里调用呢?我应该运行迁移(如果是,是哪个?),然后手动添加这个方法?

4

6 回答 6

267

您可以运行另一个迁移,仅针对索引:

class AddIndexToTable < ActiveRecord::Migration
  def change
    add_index :table, :user_id
  end
end
于 2013-04-08T14:31:47.553 回答
73

如果您需要创建一个,user_id那么这是一个合理的假设,即您正在引用一个用户表。在这种情况下,迁移应为:

rails generate migration AddUserRefToProducts user:references

此命令将生成以下迁移:

class AddUserRefToProducts < ActiveRecord::Migration
  def change
    add_reference :user, :product, index: true
  end
end

运行后rake db:migrateuser_id列和索引将被添加到products表中。

如果您只需要向现有列(例如表)添加索引nameuser则以下技术可能会有所帮助:

rails generate migration AddIndexToUsers name:string:index将生成以下迁移:

class AddIndexToUsers < ActiveRecord::Migration
  def change
    add_column :users, :name, :string
    add_index :users, :name
  end
end

删除add_column行并运行迁移。

在所描述的情况下,您可以发出rails generate migration AddIndexIdToTable index_id:integer:index命令,然后add_column从生成的迁移中删除行。但我宁愿建议撤消初始迁移并添加参考:

rails generate migration RemoveUserIdFromProducts user_id:integer
rails generate migration AddUserRefToProducts user:references
于 2014-07-08T23:01:43.743 回答
14

在创建列后添加生成的迁移如下(示例)

add_index :photographers, :email, :unique => true
于 2013-04-08T14:32:28.983 回答
10

如需参考,您可以致电

rails generate migration AddUserIdColumnToTable user:references

如果将来您需要添加一个通用索引,您可以启动它

rails g migration AddOrdinationNumberToTable ordination_number:integer:index

生成的代码:

class AddOrdinationNumberToTable < ActiveRecord::Migration
  def change
   add_column :tables, :ordination_number, :integer
   add_index :tables, :ordination_number, unique: true
  end
end
于 2017-03-29T10:23:45.883 回答
2

您可以使用它,只要认为 Job 是您要添加 index cader_id的模型的名称:

class AddCaderIdToJob < ActiveRecord::Migration[5.2]
  def change
    change_table :jobs do |t|
      t.integer :cader_id
      t.index :cader_id
    end
  end
end
于 2019-02-06T11:28:04.763 回答
2

对于那些使用 postgresql db 并面临错误的人

StandardError: An error has occurred, this and all later migrations canceled:

=== Dangerous operation detected #strong_migrations ===

Adding an index non-concurrently blocks writes

请参考这篇文章

例子:

class AddAncestryToWasteCodes < ActiveRecord::Migration[6.0]
  disable_ddl_transaction!

  def change
    add_column :waste_codes, :ancestry, :string
    add_index :waste_codes, :ancestry, algorithm: :concurrently
  end
end
于 2020-09-30T17:37:14.690 回答