我知道我可以创建一个新的迁移,但是我想知道是否可以通过这种方式来编辑现有的迁移。这只是我学习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"
永远不会添加到架构中。
答案 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