Как мне отредактировать старую миграцию Rails, чтобы добавить ссылку? - PullRequest
1 голос
/ 04 апреля 2019

Предисловие

Я знаю, что мог бы создать новую миграцию, но я хочу знать, возможно ли редактировать существующую таким образом.Это я изучаю 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 ]

4 голосов
/ 04 апреля 2019

Возможно, вы могли бы решить эту проблему, добавив новый индекс в новую миграцию.

В целом, откат миграций для их изменения приводит к всевозможным проблемам. Что происходит с данными в этих таблицах? И так далее.

Я предлагаю вам выполнить новую миграцию: rails g migration add_book_reference_on_series

Затем отредактируйте его так:

add_reference :series, :book, index: true

Надеюсь, это поможет.

Best

1 голос
/ 04 апреля 2019

Я приведу текст из оригинального вопроса, сверху.

Введение.

Я знаю, что мог бы создать новую миграцию, но я хочу знать, возможно ли редактировать существующую таким образом. Это я изучаю Rails и пробую новые вещи. Не работает рабочая версия этого кода.

Это способ редактирования существующей миграции ...

Вы можете использовать ->

rails db:migrate:down VERSION=20190402231737

без необходимости отката несколько раз.

Измените миграцию, о которой идет речь, а затем снова запустите

rails db:migrate

Но это потенциально небезопасно, если вы работаете в команде, а также выполнение всех миграций с самого начала в новой среде может привести к неожиданным результатам и, возможно, к неудаче, поскольку будет ссылка на несуществующую таблицу.

Так что этого не следует делать, если вы не знаете, что делаете.

Изменение существующих миграций - направляющие Rails
Откат определенной миграции - Stackoverflow

...