LoginSignup
1

More than 3 years have passed since last update.

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

Posted at

はじめに

本記事では、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コマンドを実行する

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
What you can do with signing up
1