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


はじめに

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

YAMLの公式はこちら

Ruby on Railsで良く使う、database.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 Railsapp/config/database.ymlを例に、他ではあまり見ない記法について説明していきます。

例:database.yml

コメントでどこで何を使っているのか書いています。
それぞれの説明は後述します。

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'] %>

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

&default

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

実例

default:
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db

上記ハッシュ(連想配列)のことをdefaultと呼ぶよという宣言をするなら

アンカーを追記する。

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

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

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

*default

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

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

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

※2020/01/17追記 YAMLでの正式名称はハッシュではなくマッピングです。
ここではRuby on Railsを例にしているため、わかりやすくするためハッシュと表現しています。
(scivolaさんアドバイスありがとうございます
参考:プログラマーのための YAML 入門 (初級編)

<<: *default

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

以下例をご覧ください。

実例

ここまで出てきた

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

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

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に以下が書かれているのと同じ意味になります。

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

以上です!

おわりに

最後まで読んで頂きありがとうございました

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

参考にさせて頂いたサイト(いつもありがとうございます)