スライドショー

【Rails入門】seedの使い方まとめ

こんにちは!フリーランスの桃太郎です。

Railsにて開発を進める際に、処理が正しく動いているか確認するために、データベースにデータを用意しておくことが多々あります。

そのようなデータを用意する仕組みとしてRailsではseeds.rbファイルを利用します。

この記事では、

・seedとは

という基本的な内容から、

・1件ごとにデータを入れる方法

・CSVデータを入れる方法

など応用的な内容についても解説していきます。

seedの使い方について正しく理解し、必要な場面で使いこなすことができるように、わかりやすく解説します!

seedとは

seeds.rbファイルはどこに存在しているかをまず確認しましょう。

#seeds.rbの格納先
(Railsルートディレクトリ)/db/seeds.rb

seeds.rbを最初に開くとコメント以外は何も記述がないかと思います。

ここにデータベースへのデータ投入の処理を追記していき、railsコマンドを実行することでデータベースに初期データとしてデータが投入されます。

データ投入の処理はいくつかあり、create文やRubyスクリプトなどを利用して記述することが可能です。

次の章からは具体的な使い方を解説します。

seedの使い方

データ投入と一言でいっても投入するデータ件数に応じて投入方法を使い分けると良いことを解説していきます。

1件ごとにデータを入れる方法

まずは1件づつ小規模のデータを入れる場合です。

プログラミング教室のレッスン情報を格納するためのlessonsテーブルがあり、そこに初期データを投入するケースを考えます。

lessonsテーブルはtitle,date,placeの3つのカラムで構成されているとします。

seeds.rbファイルを以下の通りに修正します。

Lesson.create(title: '初心者向け基本Aコース', date: '2017-07-19', place: '東京')
Lesson.create(title: '初心者向け基本Bコース', date: '2017-07-20', place: '千葉')
Lesson.create(title: '初心者向け基本Cコース', date: '2017-07-23', place: '東京')
Lesson.create(title: '初心者向け基本Dコース', date: '2017-07-29', place: '神奈川')

その後、コンソールにて以下のコマンドを実行するとDBに反映されます。

$rails db:seed

データが正しく反映されているかrails dbコマンド及びselect文で以下の通りに確認してみましょう。

[実行結果_テーブルの中身を確認]
$ rails db
sqlite> select * from lessons;
1|初心者向け基本Aコース|2017-07-19|東京|2017-08-01 01:05:32.126826|2017-08-01 01:05:32.120001
2|初心者向け基本Bコース|2017-07-20|千葉|2017-08-01 01:05:32.126826|2017-08-01 01:05:32.120098
3|初心者向け基本Cコース|2017-07-23|東京|2017-08-01 01:05:32.126826|2017-08-01 01:05:32.120101
4|初心者向け基本Dコース|2017-07-29|神奈川|2017-08-01 01:05:32.126826|2017-08-01 01:05:32.126826
sqlite>

確かにデータが投入されていることがお分り頂けたかと思います。

まとめますと、1件づつ小規模なデータを投入する際は以下の構文をseeds.rbに記載し、rails db:seedコマンドを実行する手順となります。

(モデル名).create(データの値, , , )

大量にデータを入れる方法

次に大量データの場合です。

投入するデータが100件、1000件となると、上記のような記述方法では途中で間違った内容があっても気づきにくいデメリットがあります。

そのため大量データの場合はRubyスクリプトを使用して投入処理を作成します。

まずはサンプルをご確認ください。

前提として、lessonsテーブルに紐づくcategorysテーブルがあり、category_idを1〜100まで割り振ったデータを投入するケースを考えます。

[seeds.rbの内容]
100.times do |number|
  Category.create(category_id: "#{number}")
end

上記内容でファイルを更新したのちに、rails db:seedコマンドを実行すると100件のデータが投入されていることが確認できます。(0〜99)

sqlite> select * from categories;
1|0|2017-08-01 03:24:26.025037|2017-08-01 03:24:26.025037
2|1|2017-08-01 03:24:26.047028|2017-08-01 03:24:26.047028

(中略)

99|98|2017-08-01 03:24:27.445709|2017-08-01 03:24:27.445709
100|99|2017-08-01 03:24:27.458391|2017-08-01 03:24:27.458391

#一番右はデフォルトで付与されるid、今回のcategory_idは2カラム目

CSVデータを入れる方法

例えば、都道府県の政令指定都市の情報や既存の会員情報などがすでに存在している場合、そのデータをCSV形式のファイルにして、seeds.rbにて読み込むことも可能です。

例のごとくサンプルと合わせて確認していきましょう。

郵便番号と地方名の2つの情報をもつpostsテーブルを用意し、郵便局のサイトで無料ダウンロードできる郵便番号のCSV情報を先ほどの2つだけ加工し、db/post.csvとして配置しました。

その上で、seeds.rbファイルを以下の通りに更新し、rails db:seedコマンドを実行します。

require "csv"

CSV.foreach('db/post.csv') do |info|
  Post.create(:post_no => info[0], :pref => info[1])
end

そうしますと、csvのデータが正常にデータベースに登録されていることが確認できます。

ポイントは、csvファイルのカラムそれぞれをインデックス([0]や[1])で対応するデータベースのカラムにセットしているところです。

このようにして、CSVファイルのデータも手軽に投入することが可能です。

まとめ

本記事でseedついて初期データを投入するためのものであること、そして、そのデータの量に応じて投入する処理の書き方を使い分けることについてご紹介しました。

システムの運用前に初期データとなるマスターデータ(あらかじめ用意するベースとなるデータ)を投入したり、開発段階で動作確認のために初期データを投入する機会は多いかと思います。

もし、今後seedについて使い方に迷うことがあれば、ぜひこの記事を思い出して下さいね。

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

湯浅 桃太郎

湯浅 桃太郎

20代は役者、30代はエンジニア、そして40代を迎えた現在、Webライターとして活動しながら、3人の息子たちの家庭教育、アンチエイジングなどにも力を入れて日々ノマドライフを楽しんでいます。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説