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