A Little Each Day

note to self

Railsでseeds.rbを使って初期データを投入する

こんにちは。本日は「seeds.rb」をつかってシードデータ(初期データ)を投入する方法です。

シードデータを投入する方法はいくつかありますが、今回はRailsで標準で装備されている「rake db:seed」を使用した王道のやり方を説明したいと思います。


シードデータを投入する他の方法は過去記事を参照してください。

※seed-fu

blog.otsukasatoshi.com


※active_hash

blog.otsukasatoshi.com


シードデータを書く

Railsアプリを作成すると、デフォルトで「seeds.rb」というファイルが「dbフォルダ」以下に作成されます。

基本的には、この「seeds.rb」の中に初期データを書いていきます。


今回は例として「Postモデル」があり「title」と「content」があるRailsアプリで初期データを作っていきたいと思います。

少ない初期データを追加

投入する初期データが少ない場合は、以下のように書くことができます。

# This file should contain all the record creation needed to seed the database with its default values.
# The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup).
#
# Examples:
#
#   movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }])
#   Character.create(name: 'Luke', movie: movies.first)

Post.create(:title => 'タイトル0', :content => '内容0')
Post.create(:title => 'タイト1', :content => '内容1')

end


ちょっと試してみたいときや、初期データが少ない場合はいいですよね。

大量の初期データを追加

何百・何千という大量の初期データを投入したい場合は、以下のように書くこともできます。

# This file should contain all the record creation needed to seed the database with its default values.
# The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup).
#
# Examples:
#
#   movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }])
#   Character.create(name: 'Luke', movie: movies.first)

1000.times do |i|
  Post.create(
    title:    "タイトル#{i}",
    content:  "内容#{i}"
  )
end


投入したい分だけループ文でまわしてあげます。


シードデータを投入する

上記のように初期データが書けたら、いよいよシードデータをデータベースに投入していきましょう。

シードデータを投入するには、以下のコマンドを打ちます。

$ rake db:seed


これでシードデータが投入できました。

f:id:chi_kun:20170706153637p:plain



本日は以上です。