当你两次运行rake:db seed时会发生什么?

3

我是一个新手,对于这个问题我还没有找到确定的答案。

假设我有以下代码:

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

在我的 seeds.rb 文件中,然后运行。
$rake db:seed

两次操作,数据库中会出现两个近乎相同的条目,还是覆盖之前的条目?


2
为什么不运行两次并在数据库上检查它? - Doguita
@Doguita 我的数据库中有很多非种子数据,这些数据花费了很长时间才放进去。如果出现问题,我不想删除数据库。此外,我认为让像我这样的人(即:新手)能够找到答案而不必潜在地破坏他们的数据库是很好的。 - VoA
1
我明白。但是当我有这种问题时,我只需创建一个新的Rails应用程序并进行一些测试。 - Doguita
1
@Doguita,这实际上是个好主意;我可以为这些问题使用一个新的测试应用程序。以后我会这样做的 - 谢谢! - VoA
2个回答

8

谢谢 - 这正是我在寻找的。关于唯一性验证的建议也很好。希望我能给你点赞,但可惜我还没有达到15个声望值。干杯! - VoA

4

它只是运行文件。Rails不会为您防止创建重复的种子数据。如果您的文件创建记录,每次播种时它都会尝试创建该记录。如果您不想要重复的种子数据,完全由您来防止这种情况。

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

Project.find_or_create_by_title_and_description "foo", "bar"

这将创建一个具有给定标题和描述的Project, 除非它已经存在,这样你可以随意运行rake db:seed而不会创建重复项。


VoA,请看看 meagar 的解决方案。我想这个更简洁,而且应该可以解决你的问题。我会编辑我的内容以完善信息。 - Joao Cunha
好的,我本来以为有一些Rails的魔法可以防止或干扰seeds.rb中Ruby基本代码的执行,但实际上没有这样的隐藏代码反而更容易处理。谢谢! - VoA
@VoA Rails不能假设只有一个唯一记录是适当的。您的种子文件每次运行时可能会创建50个虚假的“帖子”,而您可能希望通过运行它5次来创建250个虚假的帖子。 - user229044
同样在Rails 4中,它是find_or_create_by,它接受一个哈希。 - Donato

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