前言
我知道我可以创建一个新的迁移,但我想知道是否可以用这种方式编辑现有的迁移。这只是我学习 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 数据库:回滚
现在 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 数据库:迁移
预期结果
我想要的是用这个生成我的模式:
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
希望对您有所帮助。
最好的,
关于ruby-on-rails - 如何编辑旧的 Rails 迁移以添加引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55519199/