65
54

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-01-16

はじめに

「そういえば、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さんアドバイスありがとうございます:relaxed:
参考:プログラマーのための 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

以上です!

おわりに

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

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

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

65
54
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
65
54

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?