【问题标题】:What happens when you run rake:db seed twice?当您运行 rake:db seed 两次时会发生什么?
【发布时间】:2014-12-19 20:16:48
【问题描述】:

我是 Rails 新手,无法找到这个问题的明确答案。

假设我有

Project.create!([{title: "foo", description: "bar"}])

在我的seeds.rb 文件中然后运行

$rake db:seed

两次。数据库中是否会有两个几乎相同的条目,还是会覆盖初始条目?

【问题讨论】:

  • 为什么不运行两次并在 db 上检查一下?
  • @Doguita 我在数据库中有很多非种子数据,需要一段时间才能放入其中。如果出现问题,我不想放弃数据库。另外,我认为像我这样的人(阅读:菜鸟)能够找到答案,而不必搞砸他们的数据库,这将是一件好事。
  • 我明白了。但是当我有这种问题时,我只是创建一个新的 rails 应用程序并进行一些测试。
  • @Doguita 这实际上是个好主意;对于这类问题,我可以使用新的测试应用程序。我以后会这样做 - 谢谢!

标签: ruby-on-rails ruby rake seed


【解决方案1】:

它会重复。

如果您想运行多次,但要防止重复。我想你可以:

  1. 在一个关键字段中使用验证,例如输入validate_uniqueness_of :key_attribute
  2. 测试你的桌子的数量,比如:

    MyClass.create if MyClass.count == 0

  3. 更好的解决方案可能是使用find_or_create_by 方法。查看文档:http://easyactiverecord.com/blog/2014/03/24/using-find-or-create-with-multiple-attributes/

【讨论】:

  • 谢谢 - 正是我想要的。以及关于唯一性验证的好建议。希望我可以投票给你,但遗憾的是我仍然低于 15 代表。干杯
【解决方案2】:

它只是运行文件。就防止创建重复的种子数据而言,Rails 对您没有任何帮助。如果您的文件创建了一条记录,它会在您每次播种时尝试创建该记录。如果您不想要重复的种子数据,则完全由您来防止这种情况发生。

如果您想创建一条记录,除非它已经存在,请使用find_or_create_by

Project.find_or_create_by_title_and_description "foo", "bar"

这将创建一个具有给定标题和描述的Project,除非它已经存在,让您可以根据需要多次运行rake db:seed,而不会创建重复项。

【讨论】:

  • 美国之音,也看看 meagar 的解决方案。我想它更干净,应该可以解决您的问题。我将编辑我的以完成信息。
  • 很高兴知道。我原以为有某种 Rails 魔法可能会阻止或扰乱 seed.rb 中 ruby​​ 的基本执行,但实际上如果没有这种隐藏代码,它更容易处理。谢谢!
  • @VoA Rails 不能假设只创建一个唯一记录是合适的。您的种子文件每次运行时可能会创建 50 个虚假“帖子”,而您可能希望通过运行 5 次来创建 250 个虚假帖子。
  • 同样在 Rails 4 中,find_or_create_by 接受哈希。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
  • 2014-08-20
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 2013-10-05
相关资源
最近更新 更多