简体   繁体   中英

Ruby on Rails: loading seed data from a YAML file

如何使用 YAML 文件而不是 seed.rb 将初始数据加载到数据库中?

Add code in db/seeds.rb to parse the YAML file, eg:

seed_file = Rails.root.join('db', 'seeds', 'categories.yml')
config = YAML::load_file(seed_file)
Category.create!(config)

Then, simply place the YAML fie in db/seeds/categories.yml . The YAML file should be a list of associative arrays, eg:

- name: accessory
  shortcode: A

- name: laptop
  shortcode: L

- name: server
  shortcode: S

I used the answer @Zaz answered. It works very well.

But in the meanwhile if something went wrong with your seed data(For example you have a very large seed yaml file), you would like to know which part of your yaml went wrong. At that time you can add a block after create! for debug like this:

seed_file = Rails.root.join('db', 'seeds', 'categories.yml')
config = YAML::load_file(seed_file)
counter = 0
Category.create!(config) do |c|
  puts "Create category #{counter += 1} with name: #{c.name}"
end

Check out the Ruby on Rails Guide to fixtures:

http://guides.rubyonrails.org/testing.html#the-low-down-on-fixtures

Generally, you can create YAML fixture files in the test/ directory and then load them into your database using the rake db:fixtures:load command. The full documentation on all the cool things you can do with fixtures is here:

http://api.rubyonrails.org/classes/Fixtures.html

I built this script to handle exactly this issue, while keeping seeds yaml files separate to tests.

It has namespace support, and will automatically find records when you supply just an id

https://gist.github.com/x9sim9/78405f13b698b87ab7b234ea793399ca

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM