[Ruby on Rails] 特定のmigrationファイル(version)のみをmigrateする
毎回カラムの変更をしたい時に調べていたので備忘録に。
新しいマイグレーションファイルを作成するやり方が変更記録として確認もしやすので良いと思います。
ただ今回のやり方は追加し忘れ等、少しの変更の際に比較的楽にできると思います。
前提
- 投稿用のPostテーブルのカラム型を変更したい。
- アソシエーションがあり、データが登録されている場合は
dependent: :destroy
が必要
ではまず初めに投稿用のPostモデルを確認します。
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ファイルを開きます。
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
ファイルを確認します。
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