Rails7.13 サクッとSchemafileでマイグレーションを管理
はじめに
従来のマイグレーション方法は、「rails db:migrate」コマンドを実行するたびにファイルが生成され、管理が煩雑でした。しかし、「ridgepole」gemを使えば、ファイル管理から解放され、Schemafileでマイグレーションをシンプルに管理できます。
この記事では、「ridgepole」を使ってSchemafileでマイグレーションを管理する方法をサクッとご紹介します。
実行環境
- M2 mac mini
- Rails 7.1.3
- Ruby 3.2.3
- Mysql 8.0
- Docker 25.0.2
- vscodeエディタ
環境構築が済んでいない方はこちらを参考に環境構築を行なってください。
Ridgepole インストール
Gemfileに以下を追加する
# migration/db schema
gem 'ridgepole'
追加したGemをインストール
docker-compose exec web bundle install
Schemafile の作成
空のSchemafileを作成します。この中にSchema情報を書いていき管理していきます。
touch db/Schemafile
Schemafileを編集
Schemafileにusersテーブルの記述を行います。
options = "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPRESSED"
create_table "users", force: :cascade, options: options do |t|
t.string :user_name, null: false
t.string :email
t.datetime :created_at, null: false
t.datetime :updated_at, null: false
t.index [:email], name: "users_email_index"
end
ridgepole.rakeを作成
touch lib/tasks/ridgepole.rake
ridgepole.rakeを作成し、Schemafileのマイグレーションコマンドを管理します。
namespace :ridgepole do
desc 'ridgepole apply schemafile on development'
task :apply do
sh "bundle exec ridgepole -c config/database.yml -E #{ENV["RAILS_ENV"]} " \
"--apply --file db/Schemafile --allow-pk-change"
end
end
Schemafileをマイグレーションする
作成した「rake」を使用し、マイグレーションコマンドを実行します。今回は「development」環境でマイグレーションを行います。
docker-compose exec web rake ridgepole:apply RAILS_ENV=development
「test」環境の場合は以下を実行し、マイグレーションを行います。
docker-compose exec web rake ridgepole:apply RAILS_ENV=test
Userモデルを作成
※ Userモデルを作成している必要あり。作成していない方は以下のコマンドで作成。
docker-compose exec web rails g model User --skip-migration
スキーマにデータを作成
DBのseedはraikeファイルで管理します。
touch lib/tasks/set_up_data.rake
rakeファイルの宣言方法
namespace :ファイル名 do
task :タスク名 => :environment do
end
end
rakeファイルにseedの設定を行う
namespace :set_up_data do
task :user => :environment do
5.times.each do |t|
user = User.create(
user_name: "user#{t}",
email: "user#{t}@example.com",
created_at: Time.now,
updated_at: Time.now,
)
# user.skip_confirmation!
user.save!
end
end
end
コマンドを実行しDBにデータを流し込む
rake ファイル名:タスク名
rake set_up_data:user
TablePlusで確認
TablePlusは使いやすいため、インストールしていない方はこちらからダウンロードすることをお勧めします。
接続設定
+ボタンを選択し、Mysqlを選択。各mysqlを自画像のように設定。passwordはpasswordに設定。
各環境に合わせて「User」、「password」、「Database」を設定してください。
usersテーブルが作成されていることが確認できます。
終わり
以上で「ridgepole」を使ってSchemafileでマイグレーションを管理する方法となります。上記の設定後、Schemafileにテーブルを記述、マイグレーションコマンドを実行、を行うことでデータベースにマイグレーションを行うことが可能となります。ぜひ試してみてください。
Discussion