Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 围绕已经存在的值编写工厂_Ruby On Rails_Factory Bot - Fatal编程技术网

Ruby on rails 围绕已经存在的值编写工厂

Ruby on rails 围绕已经存在的值编写工厂,ruby-on-rails,factory-bot,Ruby On Rails,Factory Bot,当我想测试一个想法时,我一直在使用Factory Girl在开发中创建一些基本对象,我经常遇到这样的情况: ActiveRecord::RecordInvalid: Validation failed: Email has already been taken, Login has already been taken 如果我曾经在开发模式下运行过一次FactoryGirl.create:user,并将该用户留在数据库中,那么如果在关闭控制台后再次尝试运行该命令,我将不得不运行该命令两次。基本

当我想测试一个想法时,我一直在使用Factory Girl在开发中创建一些基本对象,我经常遇到这样的情况:

ActiveRecord::RecordInvalid: Validation failed: Email has already been taken, Login has already been taken
如果我曾经在开发模式下运行过一次
FactoryGirl.create:user
,并将该用户留在数据库中,那么如果在关闭控制台后再次尝试运行该命令,我将不得不运行该命令两次。基本上,序列在控制台实例之间被重置


有没有人想出一种方法来编写工厂,使它们每次都能产生独特的结果?我知道我可以使用随机生成器从一个大的域中选择一个值,从而最大限度地减少冲突的可能性。不过,如果可以的话,我想找到一个更干净的方法。

您可以为此编写一个序列

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
资料来源:

编辑

重新阅读后,您似乎正在尝试以开发模式创建数据

您应该为此使用seeds.rb文件并维护一个计数器

index = User.count || 1

User.create([
  {:email => "user#{index++}@example.com",
   :password => "password"},
  {:email => "user#{index++}@example.com",
   :password => "password"}
])

是的,我已经在用序列了。我想用某种方法来持久化序列——但在启动时将其设置为最高主键也应该有效(使用对象计数时,删除可能会导致冲突)。我的用例是在控制台中创建对象,在编码之前测试一个想法。为此,种子设定仍然感觉有点笨拙,因为我必须为我在将来的代码中预见到的每个模型创建种子定义,然后运行一个rake任务并查找在控制台中创建的对象。