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