如何编辑旧的 Rails 迁移以添加引用?

How do I edit an old Rails migration to add a reference?

前言

我知道我可以创建一个新的迁移,但我想知道是否可以用这种方式编辑现有的迁移。这只是我在学习 Rails 和尝试新事物。此代码没有生产版本 运行ning.

问题

我试图让我的 series table 在我的架构中包含对 books 的引用,但它不起作用。

初始设置

rails db:migrate:status让我处于这个状态:

Status   Migration ID    Migration Name
--------------------------------------------------
   up     20190330155354  Create articles
   up     20190401004837  Create comments
   up     20190402231737  Create books
   up     20190402233013  Create pages
   up     20190403221445  Create series

我的文件 20190402231737_create_books.rb 如下所示:

class CreateBooks < ActiveRecord::Migration[5.2]
  def change
    create_table :books do |t|
      t.integer :series_number
      t.integer :year_published

      t.timestamps
    end
  end
end

采取的步骤

首先我回滚到我要编辑的迁移(我必须 运行 以下命令 3 次 - 指定版本 # 似乎不起作用,我不确定为什么):

rails db:rollback

现在 rails db:migrate:status 让我处于这种状态:

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20190330155354  Create articles
   up     20190401004837  Create comments
  down    20190402231737  Create books
  down    20190402233013  Create pages
  down    20190403221445  Create series

我将这一行添加到图书迁移中:

t.references :series, foreign_key: true

然后我 运行 迁移:

rails db:migrate

预期结果

想要的是用这个生成我的模式:

  create_table "series", force: :cascade do |t|
    t.string "title"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["series_id"], name: "index_books_on_series_id"
  end

实际结果

t.index ["series_id"], name: "index_books_on_series_id" 永远不会添加到架构中。

您可能可以通过在新迁移中添加新索引来解决此问题。

通常,回滚迁移以更改它们会导致各种问题。这些表中的数据会发生什么变化?等等。

我建议您进行新的迁移:rails g migration add_book_reference_on_series

然后像这样编辑它:

add_reference :series, :book, index: true

希望对您有所帮助。

最佳,

我将从上面的原始问题中引用文本。

Preface.

I know I could create a new migration, but I want to know if it is possible to edit an existing one in this way. This is just me learning Rails and trying out new things. There is no production version of this code running.

这是编辑现有迁移的方法...

您可以使用 ->

rails db:migrate:down VERSION=20190402231737

无需多次回滚。

更改有问题的迁移,然后再次更改运行

rails db:migrate

但是,如果您在团队中工作并且 运行在新环境中从头开始所有迁移可能会产生意想不到的结果,并且可能会被破坏,因为将引用一个不存在的 table.

所以除非您知道自己在做什么,否则不应这样做。

Changing Existing Migrations - Rails Guides
Rollback a specific migration - Whosebug