Rails编辑迁移文件以包含索引?

时间:2016-06-26 17:21:33

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

我一直试图找出一些方法来优化我的MySQL数据库,但我在这里索引时遇到了一些问题。

与堆叠一堆迁移文件相反(因为我还没有真正管理太多数据),我只是“回头”并定期编辑迁移文件以包含列等。不确定这是否是最佳实践,但我认为避免最终添加100个迁移文件会更容易。

无论如何,我正在尝试向迁移文件中的一个列添加索引,但我似乎无法使其工作(在回滚和再次迁移后它没有显示在模式文件中)

class CreateVuln < ActiveRecord::Migration
  def change
    create_table :vuln do |t|
      t.integer :node_id
      t.string :node_identifier
      t.string :vuln_finding_identifier

      t.timestamps null: false
    end

    add_index :vuln, :node_identifier
  end
end

但是当我去schema.rb时,这就是它的样子:

  create_table "vuln", force: :cascade do |t|
    t.integer  "node_id",                 limit: 4
    t.string   "node_identifier",         limit: 255
    t.string   "vuln_finding_identifier", limit: 255
    t.datetime "created_at",                               null: false
    t.datetime "updated_at",                               null: false
  end

有人能告诉我这里缺少什么吗?如果我通过运行rails g migration AddIndexToVuln node_identifier:string:index添加新迁移,那么我可以看到schema.rb文件正确更新。 schema.rb然后添加以下行:add_index "vuln", ["node_identifier"], name: "index_vuln_on_node_identifier", using: :btree

因此,与创建新的迁移文件相反,我只是想知道我是否可以回滚数据库并在该表的现有迁移文件中进行更改。

2 个答案:

答案 0 :(得分:1)

我认为您的迁移没有任何问题,因此首先要检查的是rake db:rollback是否真的成功了。如果在添加add_index行之后运行回滚,则回滚应该失败,因为Rails将在不存在的索引上尝试remove_index。如果回滚失败,则修复很简单。注释掉add_index行并运行rake db:rollback,取消注释该行,然后运行rake db:migrate

如果您处于开发的早期阶段且确实不关心数据,则可以运行rake db:reset,这将从第一次迁移开始删除数据库并重建。

所有这一切,创建新的迁移(无论多小)修改架构绝对没有错 - 这是他们的预期目的。迟早你会发现回滚和修改迁移只是不会扩展,所以只需从一开始就采用这种方法。

答案 1 :(得分:1)

首先了解迁移的进展情况非常重要。

因此,Rails使用时间戳来跟踪迁移中的更改,因此当您运行rake db:migrate时,Rails将首先查看schema.rb以检查数据库的当前状态。您可能已经在模式文件中看到了这种行:ActiveRecord::Schema.define(version: 20160625234411) do,所有迁移都以这种方式通过时间戳进行版本化。

因此,它只会运行任何新的迁移,即其时间戳大于模式文件的时间戳。

因此,如果您想要更改数据库的状态,那么您应该实际生成新的迁移,否则,您每次都必须继续执行rake db:[drop|reset]等操作。< / p>