如何编辑旧的Rails迁移以添加参考?

时间:2019-04-04 15:01:02

标签: ruby-on-rails ruby activerecord ruby-on-rails-5 ruby-on-rails-5.2

前言

我知道我可以创建一个新的迁移,但是我想知道是否可以通过这种方式来编辑现有的迁移。这只是我学习Rails并尝试新事物。此代码没有生产版本。

问题

我试图在我的架构中获取我的series表,以包含对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"永远不会添加到架构中。

2 个答案:

答案 0 :(得分:4)

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

通常,回滚迁移以更改迁移会导致各种问题。这些表中的数据会怎样?等等。

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

然后像这样编辑它:

add_reference :series, :book, index: true

我希望这会有所帮助。

最好

答案 1 :(得分:1)

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

  

前言。

     

我知道我可以创建一个新的迁移,但是我想知道是否可以通过这种方式来编辑现有的迁移。这只是我学习Rails并尝试新事物。此代码没有生产版本。

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

您可以使用->

rails db:migrate:down VERSION=20190402231737

无需回滚多次。

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

rails db:migrate

但是,如果您在团队中工作,并且在新环境中从头开始运行所有迁移,可能会带来意想不到的结果,并且有可能被破坏,因为这将引用不存在的表。 / p>

因此,除非您知道自己在做什么,否则不要这样做。

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