Rails:添加列后添加索引

use*_*830 112 migration indexing ruby-on-rails

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

rails generate migration AddUser_idColumnToTable user_id:string. 
Run Code Online (Sandbox Code Playgroud)

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

Jaa*_*ans 214

您可以为索引运行另一次迁移:

class AddIndexToTable < ActiveRecord::Migration
  def change
    add_index :table, :user_id
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 所以我只是在我的控制台中运行:rails生成迁移AddIndexToTable? (3认同)
  • 是的,您可以这样做,但之后您必须编辑该迁移以反映上述代码. (3认同)

Vad*_*rov 64

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

rails generate migration AddUserRefToProducts user:references
Run Code Online (Sandbox Code Playgroud)

此命令将生成以下迁移:

class AddUserRefToProducts < ActiveRecord::Migration
  def change
    add_reference :user, :product, index: true
  end
end
Run Code Online (Sandbox Code Playgroud)

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

如果你只需要一个索引添加到现有的塔,例如name一的user表,下面的技术可能会有所帮助:

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

class AddIndexToUsers < ActiveRecord::Migration
  def change
    add_column :users, :name, :string
    add_index :users, :name
  end
end
Run Code Online (Sandbox Code Playgroud)

删除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
Run Code Online (Sandbox Code Playgroud)

  • 警告:请注意,index:true仅适用于create_table迁移.将运行迁移,但不会创建任何索引.请参阅https://makandracards.com/makandra/32353-psa-index-true-in-rails-migrations-does-not-work-as-you-d-expect (5认同)
  • 致@fwuensche:以后添加索引没有性能损失.但是,域逻辑不太清楚.例如,如果您决定稍后破坏/抽象/等关联,您需要处理两个单独的迁移,这实际上应该是单个迁移... (2认同)

小智 9

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

add_index :photographers, :email, :unique => true
Run Code Online (Sandbox Code Playgroud)


Mau*_*uro 7

如需参考,您可以致电

rails generate migration AddUserIdColumnToTable user:references
Run Code Online (Sandbox Code Playgroud)

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

rails g migration AddOrdinationNumberToTable ordination_number:integer:index
Run Code Online (Sandbox Code Playgroud)

生成代码:

class AddOrdinationNumberToTable < ActiveRecord::Migration
  def change
   add_column :tables, :ordination_number, :integer
   add_index :tables, :ordination_number, unique: true
  end
end
Run Code Online (Sandbox Code Playgroud)