こんにちは!フリーランスの桃太郎です。
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について使い方に迷うことがあれば、ぜひこの記事を思い出して下さいね。