🔨

Railsでridgepoleを導入する時にmigrationコマンドを無効にしたい

2024/03/22に公開

書くこと

  • rakeタスクで実行するよう修正
  • db:migrate:xxxタスクの実行時、それをせずにエラーメッセージを表示するよう修正
  • rails generate modelの時、migrationファイルを作らないよう修正

書かないこと

  • 導入手順
  • migrationからの移行手順

※ これらの手順はgithubに詳しく書いています

バージョン

  • Ruby
    • 3.2.2
  • Rails
    • 7.1.3
  • ridgepole
    • 2.0.2

やったこと

rakeタスクの作成

毎度オプション込みで書くのは大変なのでrakeタスク化する

lib/tasks/ridgepole.rake
namespace :ridgepole do
  desc 'apply Schemafile'
  task apply: :environment do
    sh "ridgepole -E ##{ENV.fetch('RAILS_ENV', 'development')} --config config/database.yml --file db/Schemafile  --apply"
    sh 'rake db:schema:dump'
  end
end

migrationの修正(無効化)

rake db:migrateはmigrationファイルを作っていない限りは動作に影響は無いが、うっかり叩いた時にridgepoleを実行するように促したい。

なのでdb:migrateに対してメッセージを表示する形で上書きする

lib/tasks/db_migrate.rake
Rake::Task['db:migrate'].clear

namespace :db do
  desc 'migrate(not available)'
  task migrate: :environment do
    puts 'This project uses ridgepole for database migration'
    puts 'Please use ridgepole:apply instead of db:migrate'
  end
end
$ rails db:migrate
This project uses ridgepole for database migration
Please use ridgepole:apply instead of db:migrate

rails generate modelの時、migrationファイルを作らないよう修正

model作成時にはmigrationが作られる

$ rails g model hoge
      invoke  active_record
      create    db/migrate/20240322093222_create_hoges.rb
      create    app/models/hoge.rb

これを作られないように設定しておく

config/application.rb
module Sample
  class Application < Rails::Application
    ## 中略

    ## ↓を追加する
    config.generators.orm :active_record, migration: false
  end
end

これでmigrationファイルが作られない

$ rails g model hoge
      invoke  active_record
      create    app/models/hoge.rb
SMARTCAMP Engineer Blog

Discussion