【rails】db:migrateする前の状態に戻したい時の対処法


こんにちは。たにーです。

久しぶりの投稿になってしまいましたが
これからサボらずに投稿します

今日は、Ruby on Railsを使っていて、
「rails db:migrate したけど、追加し忘れたカラムがあった、、、」と。

もちろんaddで追加する方法もありますが、
無駄にファイルを多く作りたくない、見た目を綺麗にしたいなどあると思います。
その時の対処方について解説します。

事前準備&復習も兼ねて

①model作成
上記のコマンドでmodel:usersを作成します。
そうすると下記が実行され、ファイルが作成されます。

terminal
 $ rails g model User name:string body:text

   Running via Spring preloader in process 10452
         invoke  active_record
         create db/migrate/20210226145734_create_users.rb
         create    app/models/user.rb
         invoke    test_unit
         create      test/models/user_test.rb
         create      test/fixtures/users.yml

②migration実行
rails db:migareを実行することで、DBに反映されます。

terminal
$ rails db:migrate

== 20210226145734 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0114s
== 20210226145734 CreateUsers: migrated (0.0126s) =============================

全てのカラムを記載するのを忘れていた

ここで[image_id]を記載するのを忘れてしまった、、、としましょう。
想定していたのは、[name],[body],[image_id]だったします。

rails db:migrateする前でしたら、ファイルに直接記入して問題ないのですが、
それだと上手く反映できない様子。
追記してmigrateするも反応なし。

_create_users.rb
class CreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
      t.string :name
      t.text :body
      t.string :image_id     ⇨追加で記載してみた
      t.timestamps
    end
  end
end

結果
$ rails db:migrate
$ 

rails db:rollbackを実行しましょう

rails db:rollback を実行することにより、
1つ前の状態に戻すことができます。

terminal
$ rails db:rollback

rails db:rollback
== 20210226152738 CreateUsers: reverting ======================================
-- drop_table(:users)
   -> 0.0051s
== 20210226152738 CreateUsers: reverted (0.0136s) =============================

これにより、migrateする前の状態に戻りました。

追加カラムをファイル内に記載し、migrate実行

_create_users.rb
class CreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
      t.string :name
      t.text :body
      t.string :image_id     ⇨追加で記載
      t.timestamps
    end
  end
end

そして、再度「rails db:migrate」を実行します。

terminal
$ rails db:migrate

== 20210226152738 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0069s
== 20210226152738 CreateUsers: migrated (0.0080s) =============================

上記のように、無事migrateされました。
schemaファイルを見おると、想定している内容で反映されておりました。

schema.rb
ActiveRecord::Schema.define(version: 2021_02_26_152738) do

  create_table "users", force: :cascade do |t|
    t.string "name"
    t.text "body"
    t.string "image_id"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

end

schema.rbについて

rails db:migrateの実行結果が反映されるファイルです。

参考文献

rails tutorial

以上、たにーでした。