Ruby on rails RubyonRails:从YAML文件加载种子数据

Ruby on rails RubyonRails:从YAML文件加载种子数据,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,如何使用YAML文件而不是seeds.rb将初始数据加载到数据库中?查看Ruby on Rails设备指南: 通常,您可以在test/目录中创建YAML fixture文件,然后使用rake db:fixtures:load命令将它们加载到数据库中。关于您可以使用固定装置进行的所有酷事情的完整文档如下: 在db/seeds.rb中添加代码以解析YAML文件,例如: seed_file = Rails.root.join('db', 'seeds', 'categories.yml') conf

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

查看Ruby on Rails设备指南:

通常,您可以在
test/
目录中创建YAML fixture文件,然后使用
rake db:fixtures:load
命令将它们加载到数据库中。关于您可以使用固定装置进行的所有酷事情的完整文档如下:


db/seeds.rb
中添加代码以解析YAML文件,例如:

seed_file = Rails.root.join('db', 'seeds', 'categories.yml')
config = YAML::load_file(seed_file)
Category.create!(config)
然后,只需将YAML fie放入
db/seeds/categories.yml
。YAML文件应该是关联数组的列表,例如:

- name: accessory
  shortcode: A

- name: laptop
  shortcode: L

- name: server
  shortcode: S

我用的是@Zaz回答的答案。它工作得很好

但与此同时,如果种子数据出现问题(例如,您有一个非常大的种子yaml文件),您希望知道yaml的哪一部分出错。此时,您可以在创建后添加块!对于这样的调试:

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

我构建了这个脚本来准确地处理这个问题,同时将种子yaml文件与测试分开

它具有名称空间支持,当您只提供一个id时,它将自动查找记录


最后一个链接已断开。另外,从
test/
加载种子数据似乎不是正确的做法。这也让我感到不舒服,但实际上有些人使用夹具填充数据以进行测试。在两个地方有相同的yaml种子文件感觉更糟…讨厌。我的答案是6年前的,我认为世界已经发生了重大变化。投票率较高的答案肯定更好,但我个人已经转向使用Seedbank gem:这个解决方案的问题是,如果您再次运行
rake db:seed
,您将得到大量重复的结果。根据对唯一性的要求,您可能希望将最后一行修改为:
config.each{| values | Category.first_或_create(values)}
在什么情况下希望对数据库进行两次种子设定
rake db:reset
在99%的时间内完成所有需要的操作。如果向表中添加新的种子值,或添加具有种子值的新表。在开发环境中删除整个数据库可能是一种解决方案,但在生产环境中肯定不是。如果在另一个表中存在对该表ID的任何引用,则在重新设定种子之前删除该种子表也不是一个选项。如果需要删除先前的种子值,情况变得更加复杂,可能需要一个解决方案,超出代码> RAKDB:种子< /代码>。@ SBKLLY考虑使用。这是一个使播种管理类似于标准rake db:seed的工具。命令是
rake seed:migrate
(和rollback)。在种子迁移中,您可以在这里的各种答案中执行标准的YAML文件加载。视为可接受的答案不是很好(将种子数据放入 Test/Sudio/Cuth>目录),并有明显的更高票数,请您考虑接受我的吗?