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

17

我该如何使用YAML文件代替seeds.rb将初始数据加载到数据库中?


由于被接受的答案不太好(将种子数据放在“test/”目录中),而且我的答案获得了更多的赞同,您能否考虑接受我的答案? - Zaz
4个回答

26

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

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

然后,将YAML文件放入db/seeds/categories.yml中。YAML文件应该是一个关联数组的列表,例如:

然后,只需将YAML文件放置在db/seeds/categories.yml中。YAML文件应该是一个关联数组的列表,例如:

- name: accessory
  shortcode: A

- name: laptop
  shortcode: L

- name: server
  shortcode: S

1
这种解决方案的问题在于,如果您第二次运行 rake db:seed,那么您将获得许多重复项。根据唯一性的要求,您可能需要修改最后一行,使其类似于:config.each {|values| Category.first_or_create(values) } - sberkley
1
在什么情况下您想要两次种子数据库?rake db:reset 99% 的时间都可以完成您所需的一切。 - Zaz
4
如果你将新的种子值添加到表中,或者添加一个带有种子值的新表。在开发环境下删除整个数据库可能是一种解决方案,但在生产环境下绝对不是。如果还有其他表中引用了该表的ID,则在重新进行种子生成之前删除种子表也不是一个选项。如果需要删除先前种植的值,则情况会变得更加复杂,并且可能需要超出“rake db:seed”范围的解决方案。 - sberkley
@sberkley 考虑使用 https://github.com/harrystech/seed_migration。这是一个工具,使得种子数据的管理类似于标准的 rake db:seed。命令是 rake seed:migrate(和回滚)。在种子迁移中,您可以执行各种答案中的标准 yaml 文件加载操作。 - user483040

5

我使用了@Zaz提供的答案,它非常有效。

但是如果您的种子数据出现了问题(例如您有一个非常大的种子yaml文件),您希望知道哪一部分yaml出了问题。这时候,您可以在create!后添加一个调试块,像这样:

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

2

3
最后一个链接已经失效了。此外,从“test/”加载种子数据似乎不是正确的做法。 - Zaz
这让我感到不舒服,但实际上有些人使用固定装置来填充测试数据。在两个地方拥有相同的yaml种子文件感觉更加...不好。 - user483040
我的回答是6年前的,我认为世界已经发生了很大的变化。得票更高的答案肯定更好,但我个人已经开始使用Seedbank gem:https://github.com/james2m/seedbank - Nuby

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接