Sendagaya.rb #325 参加レポート
はじめに
プログラミング初学者の自分が、RubyやRailsの勉強のためにSendagaya.rb #325に参加させて頂きました。
そこでRidgepoleとSquasherというRubyのgemについての話題が出てきたので、自分なりに調べた内容をまとめます。
Ridgepole
概要
RidgepoleとはRuby on RailsのDBスキーマ管理用のgemのこと。 Cookpadの方が開発したもので、2014年頃に登場した模様。
RailsでDBスキーマの変更を行う際にはその都度新たなマイグレーションファイルを作って、そこに現在の状態からの差分を記述するという使い方をするかと思います。
Ridgepoleはこの差分を記述するマイグレーションファイルを都度作成することなく、Schemafileという1つのファイルを編集するだけでスキーマの変更ができます。
使い方
まずはGemfile
にridgepole
を記述しbundle
コマンド実行でインストール。
RailsのプロジェクトのルートパスにSchemafile
を作成。
Schemafile
にDBスキーマを記述。例えば以下のように作成。
# Schemafile create_table "articles", force: true do |t| t.string "title" t.text "content" t.datetime "created_at" t.datetime "updated_at" end
ridgepole
コマンドでSchemafileをDBに反映する。ridgepole -c (dbの設定ファイルのpath) -a
コマンドで反映できる。
$ bundle exec ridgepole -c config/database.yml -a Apply `./Schemafile` -- create_table("articles", {}) -> 0.0043s
ちなみに同じSchemafileの内容でridgepoleコマンドを実行しても結果は変わらないようになっている。
$ bundle exec ridgepole -c config/database.yml -a Apply `Schemafile` No change
migrate
コマンドを使わなくなるのでgenerate
コマンドを実行する際は--skip-migration
オプションをつけると良い。(余計なmigrateファイルがあるとエラーになる模様)
$ rails g model Article --skip-migration
他にもRidgepoleの便利オプション等あるが、ここでは割愛。
Squasher
概要
SquasherとはRailsのマイグレーションファイルを一括でまとめてくれるgemのこと。
使い方
Gemfileに下記を追加しbundle
コマンドを実行。
# Gemfile # rubocopはすでに入れてあるなら記述不要 group :tools do gem "squasher", ">= 0.6.0" gem "capistrano" gem "rubocop" end
squasher
コマンドを実行するとマイグレーションファイルを一つにまとめてくれる。コマンド実行時には「~年より前のマイグレーションファイルをまとめる」という指示になるため、以下の実行結果は「2021年より前のマイグレーションファイルをまとめる」ということになる。
また、ActiveRecord::Migration
のバージョン番号を、-m
オプションで指定する。
$ bundle exec squasher 2021 -m 6.0
実行すると以下のメッセージが出てDBの削除やクリーンについて選択する。
# squasherの名称でDBを作成するかどうか # コマンド実行前のデータベースのスキーマを構築しておいてくれる Squasher's created the `squasher` database for its needs. It might be useful to keep it if any of your deleted migrations inserts data or you squash migrations in a few steps (look at -r option). Keep it (yes / no)? # 既存のデータベースをdropして、db:migrateをやり直すかどうか # yesだとレコードが消えるので注意 Do you want to clean your database from the old schema migration records(yes/no)?
実行後、db/migrate/***_init_schema.rb
ファイルが作成され、それまでのマイグレーションファイルを一つにまとめた内容が記述される。
class InitSchema < ActiveRecord::Migration[6.0] def up create_table "active_storage_attachments" do |t| t.string "name", null: false # (以下省略)
感想
Sendagaya.rbに参加し、上記2つのgemを知ることができました。どちらのgemも初耳で、ちゃんと調べてみてとても便利なものだなーと感動しました。
Sendagaya.rbの後半ではVue.jsの話題になったんですが、僕はまだVue.jsの勉強を始めていなかったのでついていけず悔しい思いでした...。
勉強会に参加すると初学者の自分は話を聞いているだけで精一杯ですが、こうやって少しでも吸収できることがあるので継続して参加していきたいです。
参考
- Ridgepole 0.0.1 - so what
- winebarrel/ridgepole: Ridgepole is a tool to manage DB schema. It defines DB schema using Rails DSL, and updates DB schema according to DSL. (like Chef/Puppet)
- クックパッドにおける最近のActiveRecord運用事情 - クックパッド開発者ブログ
- ridgepoleの紹介 - Qiita
- Squasher
- Rails でマイグレーションファイルをまとめる Squasher gem を使う - 約束の地