はじめに
Rails 6 に追加された新機能を試す第108段。 今回は、 multi-db abort_if_pending_migrations 編です。
Rails 6 では、 rails db:abort_if_pending_migrations
が multi database に対応しました。
Ruby 2.6.5, Rails 6.0.0 で確認しました。 (Rails 6.0.1 がリリースされていますが、確認した時点ではリリースされていませんでした。)
$ rails --version
Rails 6.0.0
今回は、簡単なスクリプトを作って確認します。
Rails プロジェクトを作成する
$ rails new rails_sandbox
$ cd rails_sandbox
今回は複数のDBを作って、それぞれ、 User と Book のCRUD を作ってから、 rails db:abort_if_pending_migrations
を実行して確認します。
config/database.yml を編集する
config/database.yml
を編集して複数データベースにします。
...
development:
backbone:
<<: *default
database: backbone_development
library:
<<: *default
database: library_development
migrations_paths: db/library_migrate
...
User の CRUD を作成する
User
の CRUD を作成します。
$ bin/rails g scaffold User name
Book の CRUD を作成する
Book
の CRUD を作成します。
$ bin/rails g scaffold Book title --db library
Book モデルを編集する
データベースの接続先を library
に変更します。
class Book < ApplicationRecord
connects_to database: { writing: :library, reading: :library }
end
マイグレーションを実行する
$ bin/rails db:create db:migrate
rails server
を実行する
別に実行しなくても良いのですが、別の事象に遭遇したので、ここで実行します。
$ bin/rails s
マイグレーションを作成する
rails server を実行したのとは、別のコンソールから、books に published_at カラムを追加するマイグレーションを作成します。
$ bin/rails g migration add_published_at_to_books published_at:datetime --db library
db:abort_if_pending_migrations を実行する
rails db:abort_if_pending_migrations
を実行すると、ちゃんと rails db:migrate
を実行しろとメッセージが出ます。
$ rails db:abort_if_pending_migrations
You have 1 pending migration:
20191022023755 AddPublishedAtToBooks
Run `rails db:migrate` to update your database then try again.
ブラウザでアクセスする
どういう訳か、http://localhost:3000/users または、 http://localhost:3000/books にブラウザからアクセスしても ActiveRecord::PendingMigrationError
になりませんでした。
予想と違ったので、 Issue として報告 しておきました。
試したソース
試したソースは以下にあります。
https://github.com/suketa/rails_sandbox/tree/try108_multi_db_pending