ruby-on-rails - 如何编辑旧的 Rails 迁移以添加引用?

标签 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 数据库:回滚

现在 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/

相关文章:

ruby - Ruby 排序函数到底做了什么?

ruby-on-rails - Rails 路线和模型的问题

ruby-on-rails - 如何优化 Rails 中的多态新闻提要?

ruby-on-rails - Thin 上的 Rails 应用程序

ruby-on-rails - Rails devise 求助路由报错 No route matches "/sessions/user"

ruby-on-rails - 如何更改 Rails 3 路由中的默认参数名称?

ruby-on-rails - 用于 RDF 存储的 Rails 应用程序架构

ruby-on-rails - 如何使用 ActiveRecord 仅选择存储在 Postgres 中的部分 json

ruby-on-rails - 从另一个模型的数组中检索唯一的关联模型

ruby-on-rails - 基于 Mechanize 提取职业,员工网址