使用Factory Girl创建具有唯一属性的实例

Eri*_* M. 7 ruby factory-bot

我有一个约束和一个验证放在guid字段,以便每个都是唯一的.问题是,根据我在下面的工厂定义,我只能创建一个用户实例,因为其他实例无法通过验证.

我该怎么做才能使guid字段始终是唯一的?

Factory.define(:user) do |u|
  u.guid UUIDTools::UUID.timestamp_create.to_s
end
Run Code Online (Sandbox Code Playgroud)

cri*_*spy 11

通常,Factory Girl通过序列解决问题:

Factory.define(:user) do |u|
  u.sequence(:guid) { |n| "key_#{n}" }
end
Run Code Online (Sandbox Code Playgroud)

但是,我假设您不希望有类似迭代器的东西,而是时间戳.这可以使用惰性属性(在运行时评估)来完成:

Factory.define(:user) do |u|
  u.guid { Time.now.to_s }
end
Run Code Online (Sandbox Code Playgroud)

或者,假设UUIDTools :: UUID.timestamp_create生成(希望格式合适的)时间戳:

Factory.define(:user) do |u|
  u.guid { UUIDTools::UUID.timestamp_create.to_s }
end
Run Code Online (Sandbox Code Playgroud)

  • +1 OP出现问题的原因是因为guid创建代码是在Factory定义时计算的,因此每次调用工厂时该值都是常量.三种可能的解决方案中的第三种将在每次调用工厂时生成一个新的GUID,这几乎肯定是OP正在寻找的. (2认同)