当我想测试一个想法时,我一直在使用Factory Girl来开发一些基本对象,我经常遇到这个问题:
ActiveRecord::RecordInvalid: Validation failed: Email has already been taken, Login has already been taken
如果我在开发模式下运行FactoryGirl.create :user
并将该用户留在数据库中,如果我在关闭控制台后尝试再次执行此操作,则必须运行该命令两次。基本上,序列在控制台实例之间重置。
有没有人想出办法写工厂,以便每次都能产生独特的结果?我知道我可以使用随机生成器从大域中选择一个值,从而最大限度地减少发生碰撞的可能性。如果可以的话,我想找一个更干净的方法。
答案 0 :(得分:1)
您可以为此编写序列。
Factory.sequence(:email) do |n|
"tester#{n}@example.com"
end
Factory.define :user do |f|
f.name "Tester"
f.email {Factory.next :email}
f.password "tester"
end
来源:about half way down the page.
修改强>
重新阅读后,您似乎正在尝试以开发模式创建数据。
您应该使用seeds.rb文件并维护一个计数器。
index = User.count || 1
User.create([
{:email => "user#{index++}@example.com",
:password => "password"},
{:email => "user#{index++}@example.com",
:password => "password"}
])