【YAML】Railsのdatabase.ymlについてなんとなく分かった気になっていた記法・意味まとめ

## はじめに
「そういえば、**yaml**って良く使うくせにちゃんと調べたことがないな」
と思い、特徴的な書き方をする機能３つに絞ってまとめました。

[YAMLの公式はこちら](https://yaml.org/)

**Ruby on Rails**で良く使う、`database.yaml`を例に説明します。

## 環境
```yaml
OS: macOS Catalina 10.15.1
Ruby: 2.6.5
Rails: 6.0.2.1
```

## そもそも`yaml`って何？
> YAML is a human friendly data serialization
  standard for all programming languages.

公式より抜粋しました。

「YAMLは全てのプログラミング言語で使える、人間に優しいデータの書き方だよ！」ということですね。

要するに、**複雑なデータ構造をシンプルに表現するファイル形式**です。

ここから**Ruby on Rails**の`app/config/database.yml`を例に、**他ではあまり見ない記法**について説明していきます。

## 例:`database.yml`
コメントでどこで何を使っているのか書いています。
それぞれの説明は**後述**します。

```yaml:app/config/database.yml
default: &default #アンカー
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db

development:
  <<: *default #エイリアス・ハッシュのマージ
  database: app_name_development

test:
  <<: *default #エイリアス・ハッシュのマージ
  database: app_name_test

production:
  <<: *default #エイリアス・ハッシュのマージ
  database: app_name_production
  username: app_name
  password: <%= ENV['APP_NAME_DATABASE_PASSWORD'] %>
```

## アンカー: 名前をつける機能

```yaml
&default
```
これを**アンカー**と呼びます。
該当部に**名前をつける**機能です。

### 実例

```yaml
default:
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db
```
上記ハッシュ（連想配列）のことを`default`と呼ぶよという宣言をするなら
↓
**アンカー**を追記する。

```yaml:app/config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db
```

**アンカー**を書いておくことにより、次の**エイリアス**が使えるようになります。

## エイリアス: 名前をつけたものを呼び出す

```yaml
*default
```
**アンカー**を付けたものを**呼び出す**ときに使います。

これがどう使われているのかは以下**ハッシュのマージ**を絡めて後述します。

## ハッシュのマージ: 一つにまとめる

> ※2020/01/17追記 YAMLでの正式名称は**ハッシュ**ではなく**マッピング**です。
ここではRuby on Railsを例にしているため、わかりやすくするため**ハッシュ**と表現しています。
（scivolaさんアドバイスありがとうございます:relaxed:）
参考：[プログラマーのための YAML 入門 (初級編)](https://magazine.rubyist.net/articles/0009/0009-YAML.html#yaml-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

```yaml
<<: *default
```

`<<:`の右側にあるものを、該当部に**まとめる**という意味になります。

以下例をご覧ください。


### 実例
ここまで出てきた

- **アンカー**
- **エイリアス**
- **ハッシュのマージ**


の知識を使うと、以下の`development`で何を意味しているのかが説明できます。

```yaml:app/config/database.yml
default: &default #ここで共通部分にアンカーで名前をつけておくと
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db

development:
  <<: *default #ここでdefaultとして呼び出し、スッキリ書ける
  database: app_name_development
```
↓
つまり、**development**に以下が書かれているのと同じ意味になります。

```yaml:app/config/database.yml
#...略
development:
  #ここからdefault
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db
  #ここまでdefault
  database: app_name_development
```

**以上です！**

## おわりに
最後まで読んで頂きありがとうございました:bow_tone1:

どなたかの参考になれば幸いです:relaxed:

## 参考にさせて頂いたサイト（いつもありがとうございます）
- [YAML入門 (全11回) - プログラミングならドットインストール](https://dotinstall.com/lessons/basic_yaml_v2)
- [The Official YAML Web Site](https://yaml.org/)
- [プログラマーのための YAML 入門 (初級編)](https://magazine.rubyist.net/articles/0009/0009-YAML.html#yaml-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)