柴ブログ

プログラミング奮闘記

Sendagaya.rb #325 参加レポート

はじめに

プログラミング初学者の自分が、RubyRailsの勉強のためにSendagaya.rb #325に参加させて頂きました。

sendagayarb.doorkeeper.jp

そこでRidgepoleとSquasherというRubyのgemについての話題が出てきたので、自分なりに調べた内容をまとめます。

Ridgepole

概要

RidgepoleとはRuby on RailsのDBスキーマ管理用のgemのこと。 Cookpadの方が開発したもので、2014年頃に登場した模様。

RailsでDBスキーマの変更を行う際にはその都度新たなマイグレーションファイルを作って、そこに現在の状態からの差分を記述するという使い方をするかと思います。

Ridgepoleはこの差分を記述するマイグレーションファイルを都度作成することなく、Schemafileという1つのファイルを編集するだけでスキーマの変更ができます。

使い方

まずはGemfileridgepoleを記述し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の勉強を始めていなかったのでついていけず悔しい思いでした...。

勉強会に参加すると初学者の自分は話を聞いているだけで精一杯ですが、こうやって少しでも吸収できることがあるので継続して参加していきたいです。

参考