Rails6 のちょい足しな新機能を試す35（multidb migration --database オプション編）

# はじめに

Rails 6 に追加されそうな新機能を試す第35段。 今回は、 `複数データベース migration --databaseオプション` 編です。
Rails 6 は、 複数データベースをサポートしています。それに伴い、migration のファイルをデータベース毎に分けられるように `rails g migration` に `--database(--db)` オプションが追加されています。

Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。
PostgreSQL 10.7 で確認しました。

```shell
$ rails --version
Rails 6.0.0.rc1
```

# rails プロジェクトを作る

```shell
$ rails new rails6_0_0rc1
$ cd rails6_0_0rc1
```

# config/database.yml を編集する

今回の機能を試すため、接続先のデータベースを2つにします。
1つは、 `backbone_development` で、もう1つは、 `library_development` です。
`backbone_development` の migration のファイルは、従来通りのディレクトリ `db/migrate` に作成します。
`library_development` の migration のファイルは、 `db/library_migrate` ディレクトリに作成します。
なお、今回は、development 環境だけ2つのデータベースに設定しました。

`development` の1つ下の階層が、 `backbone` と `library` の2つに分かれていることに注意してください。
また、 `library` の方は、 migration のファイルの保存先のディレクトリを `migrations_paths` で指定しています。

```yaml:config/database.yml
development:
  backbone:
    <<: *default
    database: backbone_development
  library:
    <<: *default
    database: library_development
    migrations_paths: db/library_migrate
```

# backbone_development 用に users テーブルの migration ファイルを作る

backbone_development に `users` テーブルを作るための、 migration ファイルを作成します。
これは、Rails 5 までと同じです。

```shell
$ bin/rails g migration CreateUser name
Running via Spring preloader in process 2931
      invoke  active_record
      create    db/migrate/20190608225735_create_user.rb
```

# library_development 用に books テーブルの migration ファイルを作る

今度は、library_development に `books` テーブルを作るための、 migration ファイルを作成します。
ここで、今回のちょい足し機能 `--database (--db)` オプションを使います。

```shell
$ bin/rails g migration CreateBook title --db library
Running via Spring preloader in process 2937
      invoke  active_record
      create    db/library_migrate/20190608225808_create_book.rb
```

ファイルのパスが `db/library_migrate/20190608225808_create_book.rb` になっていますね。

# db:create を実行する

データベースを作成するため、 `bin/rails db:create` を実行します。

```shell
$ bin/rails db:create
Created database 'backbone_development'
Created database 'library_development'
...
```

2つのデータベースが作成されました。

# migration を実行する

テーブルを作成するため、 `migration` を実行します。

```shell
$ bin/rails db:migrate
bash-4.4# bin/rails db:migrate
== 20190608225735 CreateUser: migrating =======================================
-- create_table(:users)
   -> 0.0113s
== 20190608225735 CreateUser: migrated (0.0113s) ==============================

== 20190608225808 CreateBook: migrating =======================================
-- create_table(:books)
   -> 0.0138s
== 20190608225808 CreateBook: migrated (0.0139s) ==============================
```

# psql で確認する

psql で確認してみます。

データベースが2つできていることを確認します。

```
postgres=# \l
                                      List of databases
         Name         |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
----------------------+----------+----------+------------+------------+-----------------------
 ...
 backbone_development | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 library_development  | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 ...
```

`backbone_development` データベースに切り替えます。

```
postgres=# \c backbone_development
psql (11.3, server 10.7)
You are now connected to database "backbone_development" as user "postgres".
```

`users` テーブルができていることを確認します。

```
backbone_development=# \dt;
                List of relations
 Schema |         Name         | Type  |  Owner
--------+----------------------+-------+----------
 ...
 public | users                | table | postgres
 ...
```

`users` テーブルのカラムも確認してみます。

```
backbone_development=# \d users;
                                 Table "public.users"
 Column |       Type        | Collation | Nullable |              Default
--------+-------------------+-----------+----------+-----------------------------------
 id     | bigint            |           | not null | nextval('users_id_seq'::regclass)
 name   | character varying |           |          |
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)
```

今度は、 `library_development` にデータベースを切り替えます。

```
backbone_development=# \c library_development
psql (11.3, server 10.7)
You are now connected to database "library_development" as user "postgres".
```

`library_development` に `books` テーブルがあることと `books` テーブルのカラムを確認します。

```
library_development=# \dt;
                List of relations
 Schema |         Name         | Type  |  Owner
--------+----------------------+-------+----------
 ...
 public | books                | table | postgres
 ...
```

```
library_development=# \d books;
                                 Table "public.books"
 Column |       Type        | Collation | Nullable |              Default
--------+-------------------+-----------+----------+-----------------------------------
 id     | bigint            |           | not null | nextval('books_id_seq'::regclass)
 title  | character varying |           |          |
Indexes:
    "books_pkey" PRIMARY KEY, btree (id)
```

# 各データベース用のコマンド

今回、使いませんでしたが、各データベース用のコマンドが使えるようになります。

```
$ bin/rails -T | grep db | grep -e backbone -e library
rails db:create:backbone                 # Create backbone database for current environment
rails db:create:library                  # Create library database for current environment
rails db:drop:backbone                   # Drop backbone database for current environment
rails db:drop:library                    # Drop library database for current environment
rails db:migrate:backbone                # Migrate backbone database for current environment
rails db:migrate:library                 # Migrate library database for current environment
rails db:migrate:status:backbone         # Display status of migrations for backbone database
rails db:migrate:status:library          # Display status of migrations for library database
```

# model の作成や　scaffold

`bin/rails g model` や `bin/rails g scaffold` にも、 `--database(--db)` オプションが追加されているようです。
# schema ファイル

スキーマのファイルは、 backbone_schema.rb と library_schema.rb の2つが作成されます。



# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try035_database_option

# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Add migrations_paths option to migration generator](https://github.com/rails/rails/pull/33760)
* [Add migrations_paths option to model generator](https://github.com/rails/rails/pull/33994)
* [Refactor migrations_path command option to database](https://github.com/rails/rails/pull/34021)
* [Multiple Databases with Active Record](https://edgeguides.rubyonrails.org/active_record_multiple_databases.html)