Railsのテストデータをyamlで管理しよう 【人間の脳はリレーションしない】
この記事は Classi Advent Calendar 2017 - Qiita 20日目の記事です。
今回はRailsのtest時に使うテストデータまたは初期データをyamlで書く方法を紹介。
きっかけ
- テーブル多いリレーション多い人間の脳じゃデータのリレーションを維持できない
seed.rbとどう違うか
- yaml形式でかけるので人間が読みやすい
- modelを定義しておけばリレーションを自動で管理してくれる(例外あり
- リレーションが多い場合にあまり気にしなくて良くなるので楽
- レコードごとに名前をつけられるのでデータを呼ぶ時に楽ちん
- テーブルが大きかったりするとデータの生成が面倒
- カラムが増えると全部かかないといけないので面倒
というような特徴(個人的)がある。
使い方
"#{Rails.root}/test/fixtures/" にyamlを置くことが多い。
また、modelも定義しておく必要がある。
以下のような書式で書く
# test/fixtures/users.yml user1: password: aaa name: John Doe birthday: 2000-01-01 00:00:00 user2: name: "222442" password: fefj birthday: 1990-01-01 00:00:00
# app/model/user.rb class User < ApplicationRecord end
rails db:fixtures:load
でデータを流し込む
ここまでは基本的な説明で真価の発揮はここから
# app/model/user.rb class User < ApplicationRecord end
# app/model/memos.rb class Memo < ApplicationRecord belongs_to :user end
このようなmodelがあった時に
# test/fixtures/users.yml user1: password: aaa name: John Doe birthday: 2000-01-01 00:00:00 user2: name: "222442" password: fefj birthday: 1990-01-01 00:00:00
# test/fixtures/memos.yml memo_user1: user: user1 body: This is memo. memo_user2: user: user2 body: This is memo.
こうかくとmemosのそれぞれのuser_idにusers.yml
で定義したユーザの値が自動で入ってくれる。
リレーションを自動でつけてくれるので便利!
注意事項
- 数字だけで構成されるものは自動的に数値として扱われるので、数字だけで構成された文字列を書きたい場合はダブルクォーテーションで括る
- id系は自動生成されるが、自分で明示的に指定するとその部分のリレーションは全て自分で入れなければならない
# test/fixtures/users.yml user1: id: 1 password: aaa name: John Doe birthday: 2000-01-01 00:00:00 user2: id: 2 name: "222442" password: fefj birthday: 1990-01-01 00:00:00
このようにidを自分で指定すると
# test/fixtures/memos.yml memo_user1: user_id: 1 body: This is memo. memo_user2: user_id: 2 body: This is memo.
こう書かなければリレーションされない
まとめ
- リレーションを自分で管理するのはテーブル数が多い場合に死ぬので人間の脳みそでやるのはおすすめしない
- id