db:seed とは
Rails アプリに予め必要なデータをデータベースに一括で投入することができる機能。今回はアプリ内でenumっぽく使いたいデータをどんどん投入していきます。
手順
まずはモデルとmigrateファイルを作り、db:migrate
を実行します。
$ rails generate model area name:string
$ rails db:migrate # railsは5系です
これでAreaテーブルが作成されます。(ここらへん曖昧)
で、Rails プロジェクトの db/seeds.rb
と以下のように編集します。
Area.create({name: '北海道'})
Area.create({name: '東北'})
Area.create({name: '関東'})
Area.create({name: '甲信越'})
Area.create({name: '東海・北陸'})
Area.create({name: '近畿'})
Area.create({name: '中国'})
Area.create({name: '四国'})
Area.create({name: '九州'})
保存して以下のコマンドを実行します。
$ rails db:seed
すると Area テーブルに9行のレコードが生成されます。
試しに rails console
で見てみます。
$ rails console
irb> Area.all
(2.9ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
Area Load (1.5ms) SELECT `areas`.* FROM `areas` LIMIT 11
=> #<ActiveRecord::Relation [#<Area id: 1, name: "北海道", created_at: "2017-08-11 04:16:13", updated_at: "2017-08-11 04:16:13">, #<Area id: 2, name: "東北", created_at: "2017-08-11 04:16:13", updated_at: "2017-08-11 04:16:13">, #<Area id: 3, name: "関東", created_at: "2017-08-11 04:16:13", updated_at: "2017-08-11 04:16:13">, #<Area id: 4, name: "甲信越", created_at: "2017-08-11 04:16:13", updated_at: "2017-08-11 04:16:13">, #<Area id: 5, name: "東海・北陸", created_at: "2017-08-11 04:16:13", updated_at: "2017-08-11 04:16:13">, #<Area id: 6, name: "近畿", created_at: "2017-08-11 04:16:13", updated_at: "2017-08-11 04:16:13">, #<Area id: 7, name: "中国", created_at: "2017-08-11 04:16:13", updated_at: "2017-08-11 04:16:13">, #<Area id: 8, name: "四国", created_at: "2017-08-11 04:16:13", updated_at: "2017-08-11 04:16:13">, #<Area id: 9, name: "九州", created_at: "2017-08-11 04:16:13", updated_at: "2017-08-11 04:16:13">]>
まあなんかいけてるっぽいw
db/seeds.rb
に以下のように書くとCSVからデータを投入することもできる
require "csv"
CSV.foreach('db/company.csv') do |row|
Company.create({area_id: row[0]}, {name: row[1]})
end
めっちゃ便利!
seed で IDを指定してレコードを作る
下記のようにブロックで書くとIDを指定することができます。
Area.create do |a|
a.id = 1
a.name = '北海道'
end