No description, website, or topics provided.
Ruby HTML CSS JavaScript
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
app
bin
config
db
lib
log
public
spec
vendor/assets
.gitignore
.rspec
Gemfile
Gemfile.lock
README.md
Rakefile
config.ru

README.md

FactoryGirl で冪等 database seeding

構造

$ tree db/seeds
db/seeds
├── development.rb
├── factories
│   ├── cities.rb
│   ├── countries.rb
│   └── prefectures.rb
├── factories.rb
├── production.rb
└── test.rb
  • rake db:seed すると db/seeds/#{env}.rb が require されてコードが実行される
    • 共通処理書きたければ、各ファイルから共通ファイル require する、とか?
  • db/seeds/factories.rb には共通処理を書いておく
  • db/seeds/factories/**/*.rb にファクトリを置く
    • ファクトリは initialize_with { find_or_initialize_by } して冪等保証してるだけ

使い方

ファクトリを書く

冪等保証のために initialize_with { find_or_initialize_by } を使っているので、モデルごとにファクトリを作る必要がある。

ファクトリは db/seeds/factories/ 以下に配置する想定。

FactoryGirl.define do
  factory :prefecture do
    initialize_with { Prefecture.find_or_initialize_by(country: country, name: name) }
  end
end

seed を書く

実際の seed 処理は db/seeds/#{Rails.env}.rb に書く想定なので、それぞれ書く必要がある。

create(:country, name: '日本') do |japan|
  create(:prefecture, country: japan, name: '東京都') do |tokyo|
    create(:city, prefecture: tokyo, name: '千代田区')
    create(:city, prefecture: tokyo, name: '港区')
  end
  create(:prefecture, country: japan, name: '神奈川県') do |kanagawa|
    create(:city, prefecture: kanagawa, name: '横浜市')
    create(:city, prefecture: kanagawa, name: '川崎市')
  end
end