Rails:添加列后添加索引

时间:2013-04-08 14:28:23

标签: ruby-on-rails indexing migration

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

rails generate migration AddUser_idColumnToTable user_id:string. 

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

6 个答案:

答案 0 :(得分:199)

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

class AddIndexToTable < ActiveRecord::Migration
  def change
    add_index :table, :user_id
  end
end

答案 1 :(得分:61)

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

rails generate migration AddUserRefToProducts user:references

此命令将生成以下迁移:

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

运行rake db:migrate后,user_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

删除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

答案 2 :(得分:9)

在创建以下(示例)

列后添加生成的迁移
add_index :photographers, :email, :unique => true

答案 3 :(得分:4)

对于参考,您可以致电

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 :dt_json_structs, :ordination_number, unique: true
  end
end

答案 4 :(得分:1)

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

NULL

答案 5 :(得分:0)

对于那些使用postgresql db并遇到错误的人

http://localhost:3000/

请参阅this article

示例:

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

=== Dangerous operation detected #strong_migrations ===

Adding an index non-concurrently blocks writes