✴️

[Ruby on Rails] 特定のmigrationファイル(version)のみをmigrateする

2023/07/13に公開

毎回カラムの変更をしたい時に調べていたので備忘録に。

新しいマイグレーションファイルを作成するやり方が変更記録として確認もしやすので良いと思います。
ただ今回のやり方は追加し忘れ等、少しの変更の際に比較的楽にできると思います。


前提

  • 投稿用のPostテーブルのカラム型を変更したい。
  • アソシエーションがあり、データが登録されている場合はdependent: :destroyが必要

ではまず初めに投稿用のPostモデルを確認します。

models/post.rb
 has_many :post_comments, dependent: :destroy
 has_many :favorites,     dependent: :destroy

今回はコメント機能といいね機能を実装済みでした。
マイグレーションファイルを更新する際、Postテーブルの全てのテーブルが削除されます。
なのでアソシエーションの記述にdependent: :destroyがあることを確認します。

※もしエラーとなってしまってもrails cで全て消してあげましょう。

例: PostCommentのデータを全て削除する場合

 ec2-user:~/environment/hogehoge_app (main) $ rails c
 Running via Spring preloader in process 30958
 Loading development environment (Rails 6.1.7.3)
 3.1.2 :001 > PostComment.destroy_all

destroy_allメソッドはテーブルの全てのレコードを削除したい時に便利です。


では次にターミナルでmigration statusを確認します。

rails db:migrate:status
Running via Spring preloader in process 25083
database: db/development.sqlite3
 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20230706080340  Devise create members
   up     20230706085118  Create posts
   up     20230706085240  Create favorites
   up     20230706085317  Create post comments

するとこのようにmigrationの適用状態が表示されます。
次からMigration IDが必要となるのでコピーしておきます。
今回の場合ではPostテーブルを変更したいので二番目の20230706085118
この番号をコピーします。

次にマイグレーションの指定をしてdownします。

rails db:migrate:down VERSION=20230706085118

これをしないとマイグレーションを変更できません。

Running via Spring preloader in process 26032
== 20230706085118 CreatePosts: reverting ======================================
-- drop_table(:posts)
   -> 0.0145s
== 20230706085118 CreatePosts: reverted (0.0191s) =============================

このように出てきたら成功です。
この状態でステータスを確認すればマイグレーションの二番目がdownになっているはずです。

マイグレーションファイルの変更

次にdb/migrate配下のcreate_posts.rbファイルを開きます。

20230706085118_create_posts.rb
class CreatePosts < ActiveRecord::Migration[6.1]
  def change
    create_table :posts do |t|

      t.integer :member_id,    null: false
      t.string  :title,        null: false
      t.string  :introduction, null: false
      t.boolean :is_open,      null: false, default: true
     
      t.timestamps
    end
  end
end

今回変えたいのはis_openカラムなのでこちらを変更します。

t.integer :open_status,  null: false, default: 0

こちらはステータス管理用のカラムです。
今回はステータスの状態を増やしたかったのでカラム型を変更します。
変更するにあたりカラム名も変更しました。
こちらは適宜変更したいように変えてください。

rails db:migrate:up VERSION=20230706085118

では追加、変更が完了したら変更したマイグレーションファイルをupします。

Running via Spring preloader in process 16765
== 20230706085118 CreatePosts: migrating ======================================
-- create_table(:posts)
   -> 0.0066s
== 20230706085118 CreatePosts: migrated (0.0074s) =============================

このようにターミナルに表示されたら最後にschema.rbファイルを確認します。

schema.rb
 create_table "posts", force: :cascade do |t|
    t.integer "member_id", null: false
    t.string "title", null: false
    t.string "introduction", null: false
    t.integer "open_status", default: 0, null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false

変更の反映が確認できました。
これでテーブルの変更が完了です。

最後に

このような記事を投稿したことがなかった(知識が浅くてできなかった)ので試してみましたが、アウトプットにとても良いと思いました。
たくさんの方の記事に助けられ勉強効率を上げることができていたので、この記事がどなたかの役に立てば幸いです。
なにか間違い(誤字脱字、技術面等)があればご指摘ください。
最後まで見てくださりありがとうございました。一緒に勉強がんばりましょう!

Discussion