0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Rails]seed_fuで初期データ投入!

Posted at

seed_fuとは

seed-fuは、すでに存在しているが変更したいレコードだけ更新したり、ファイル単位で実行できたり、簡単に書けるようなシンタックスシュガーがあったりと便利なgemです。

##使い方
1.Gemfileに以下を記述する。


gem 'seed-fu'

合わせてこちらも実行する。


$ bundle install
  1. seed ファイルを置くディレクトリを作成する。
    ※db/fixture 以下の seed ファイルはアルファベット順に読み込まれます。読み込む順番を指定する必要がある時はファイル名の始めに数字を入れましょう。

# 必ず必要なディレクトリ
db/fixtures

# 環境ごとに異なるデータを作成する
db/fixtures/development
db/fixtures/production

3.db/fixturesに以下にseedファイルを作成します。

01_category.rb

Category.seed do |c|
  c.id = 1
  c.name = 'HTML'
end

Category.seed do |c|
  c.id = 2
  c.name = 'CSS'
end

Category.seed do |c|
  c.id = 3
  c.name = 'Ruby'
end

4.seed_fu コマンドを実行する。


$ rails db:seed_fu

##小技集

####seed_onceを使う
一度データを作成した後は更新したくない場合、 seed_onceを使います。


Category.seed_once do |s|
  s.id = 1
  s.name = 'HTML'
end

####シンタックスシュガー
seedファイルを作成する時は、これまでのような記述の他に以下のように記述することが出来る。


Category.seed(:id,
 { id: 1, name: 'HTML' },
 { id: 2, name: 'CSS' },
 { id: 3, name: 'Ruby' },
)

####CSVファイルからデータを作成
※要素をカンマで区切る。(ここでは、id、nameの順)

db/fixtures/development/category.csv

1,HTML
2,CSS
3,Ruby

CSVから読み込む処理を書く。

db/fixtures/development/01_category.rb

require 'csv'

csv = CSV.read('db/fixtures/development/category.csv')
csv.each do |category|
 Category.seed do |s|
  s.id = category[0] # ここではid
  s.name = category[1] # ここではname
 end
end

最後に以下のコマンドを実行


$ rails db:seed_fu

####ユーザー作成
seed_fuではパスワードがうまく設定されないのでデフォルトのseedでする。

db/fixtures/development/00_user.rb

User.create!(id: 1, name: 'yuh', email: 'sample@test.com',
password: 'password', password_confirmation: 'password')
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?