Help us understand the problem. What is going on with this article?

Railsアプリケーションで初期データをセットアップする方法あれこれ

More than 1 year has passed since last update.

はじめに

本記事では、Railsアプリケーションにおける初期データのセットアップ方法の基本から、知っておくと少し役立つTipsを紹介します。具体的には、以下の内容です。

  • データセットアップ手順の基本
  • データセットアップのTips
    • ロード先の環境を指定する方法
    • 環境ごとにロードするデータを分ける方法
    • データを消してから再ロードする方法
    • ファイルからデータをロードする方法(CSV・JSON)

データセットアップ手順の基本

以下のカラムを持つ「Members」テーブルに初期データをセットアップしたいとします。

カラム名
member_id string
name string
age integer
created_at datetime
updated_at datetime

1.seeds.rbを編集する

rails newコマンドでRailsプロジェクトを作成すると、db/seeds.rbというファイルが自動生成されているはずです。

このファイルにデータセットアップするためのコードを記述します。ちなみにseeds.rbには初期状態でコメントが記述されているかと思いますが、このコメントは削除してもしなくてもOKです。

今回は、ActiveRecordのcreate!メソッドを使います。後述するrake db:seedというコマンドを実行すると、seeds.rbに記述したこれらの処理が実行されます。

createはバリデーションエラー時にnilを返しますが、create!はエラーになります。

db/seeds.rb
# coding: utf-8

Member.create(member_id: '001', name: 'ウッディ', age: 25)
Member.create(member_id: '002', name: 'バズ', age: 30)
Member.create(member_id: '003', name: 'リトルグリーンメン', age: 999)

2.rake db:seedを実行する

では、rake db:seedを実行してみましょう。

$ rake db:seed
$ rails db

sqlite> select * from Members;
1|001|ウッディ|25|2019-07-08 12:35:46.734420|2019-07-08 12:35:46.734420
2|002|バズ|30|2019-07-08 12:35:46.738636|2019-07-08 12:35:46.738636
3|003|リトルグリーンメン|999|2019-07-08 12:35:46.741150|2019-07-08 12:35:46.741150

seeds.rbに記述したレコード保存処理が実行され、3レコードが保存されていることが確認できました。

まとめると、

  1. db/seeds.rbにレコードを保存する処理を記述する
  2. rake db:seedコマンドを実行する

この2ステップがデータセットアップの基本になります。

データセットアップのTips

ということで、基本だけ知っていればとりあえず初期データを投入することができますが、更に知っておくと便利なTipsを紹介します。

ロード先の環境を指定する

$ rake db:seed RAILS_ENV=test

RAILS_ENVオプションを指定するとロード先の環境を指定することができます。テスト環境にロードする場合はRAILS_ENV=testとなります。

オプションを指定しないとdevelopment環境にロードされます。

データを消してから再ロードする

rake db:migrate:resetコマンドでロードされているデータをリセット(削除)することができます。

再ロードする場合は続けてrake db:seedすればOKです。

環境ごとにロードするデータを分ける

環境ごとにロードするデータを分けて準備することも可能です。

db/seeds.rbの内容を以下に書き換えます。

db/seeds.rb
load(Rails.root.join('db', 'seeds', "#{Rails.env.downcase}.rb"))

次にdb/seeds/環境名.tbというファイルを新たに作成し、レコード保存の処理を記述します。test環境にロードする場合、db/seeds/test.rbというファイルになります。

db/seeds/test.rb
# coding: utf-8

Member.create(member_id: '001', name: 'ウッディ', age: 25)
Member.create(member_id: '002', name: 'バズ', age: 30)
Member.create(member_id: '003', name: 'リトルグリーンメン', age: 999)

そしてrake db:seed RAILS_ENV=testを実行すると、db/seeds/test.rbに記述した通りにtest環境にデータがロードされます。

同じようにdb/seeds/development.rbdb/seeds/production.rbのようにdb/seeds/環境名.tbというファイルを用意することで、環境ごとにロードするデータを分けることができます。

参考: 環境ごとに投入する初期データを変える

ファイルからデータをロードする方法

ファイルに記述したデータからセットアップすることもできます。

CSVファイルからロードする

CSVからロードする場合、以下のようにCSVファイルのデータを参照してcreateするように記述します。

db/sample.csv
'001','ウッディ',25
'002','バズ',30
'003','リトルグリーンメン',999
db/seeds.rb
require "csv"

CSV.foreach('db/sample.csv') do |row|
  Member.create(member_id: row[0], name: row[1], age: row[2])
end

require "csv"を忘れずに!

JSONファイルからロードする

JSONファイルからもロードできます。

db/sample.json
[
  {
    "member_id": "001",
    "name": "ウッディ",
    "age": 25
  },
  {
    "member_id": "002",
    "name": "バズ",
    "age": 30
  },
  {
    "member_id": "003",
    "name": "リトルグリーンメン",
    "age": 999
  }
]
db/seeds.rb
json = ActiveSupport::JSON.decode(File.read('db/sample.json'))

json.each do |data|
    Member.create(member_id: data['member_id'], name: data['name'], age: data['age'])
end

まとめ

以上です。基本的には以下の2ステップでロードできます。簡単ですね!

  1. db/seeds.rbにレコードを保存する処理を記述する
  2. rake db:seedコマンドを実行する
tatehito
都内で働くプログラマ。Java・Rubyなど。
https://blog.tatehitolog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away