如何使用工厂女孩创建唯一的字符串(没有数字)?

Posted

技术标签:

【中文标题】如何使用工厂女孩创建唯一的字符串(没有数字)?【英文标题】:How can I create unique strings (with no numbers) with factory girl? 【发布时间】:2014-01-21 04:07:21 【问题描述】:

或者是否需要一个外部 gem 来生成随机且唯一的用户名?

这是我目前的工厂:

factory :user_4 do
    sequence(:id)  |n| n 
    sequence(:first_name)  |n| "Gemini" + n.to_s 
    sequence(:last_name)  |n| "Pollux" + n.to_s 
    sequence(:profile_name)  |n| "GeminiPollux" + n.to_s  
    sequence(:email)  |n| "geminipollus" + n.to_s + "@hotmail.co.uk" 
end

使用序列方法适用于 id、profile_name 和电子邮件,但我的 REGEX 验证意味着名字和姓氏自动无效,因为它们中有一个数字。与独特性无关。

那么我应该如何创建这些唯一的名称呢?

【问题讨论】:

【参考方案1】:
factory :user_4 do
  # ...
  sequence(:first_name, 'a')  |n| "Gemini" + n 
  sequence(:last_name, 'a')  |n| "Pollux" + n 
  # ...
end

FactoryGirl 的#sequence 方法接受第二个参数作为其起始值。这可以是 String、Fixnum 或其他支持通过 #next 方法递增的内容。

起始值为'a',序列将为a, b, c ... z, aa, ab, ac ...

【讨论】:

最佳答案!你也可以使用'A',它会做A, B ... Z, AA, AB ...【参考方案2】:

有infinite possible solutions可以生成随机字符串,不依赖第三方gem。

这是一个

('a'..'z').to_a.shuffle.join
# => "sugrjtyoiqlbxkzcfnawdhpevm"

例子

factory :user_4 do
  sequence(:id)  |n| n 
  first_name  "Gemini" + random_name 
  # ...
end

def random_name
  ('a'..'z').to_a.shuffle.join
end

如果随机因子太低,可以增加复杂度。

【讨论】:

这个答案对我很有帮助,但对我来说不直观的一条信息是方法定义不仅必须在工厂声明之外,还必须在 FactoryGirl.define do 之外也阻止。【参考方案3】:
factory :user_4 do
  letters = [a,b,c,d]
  sequence(:id)  |n| n 
  sequence(:first_name)  |n| "Gemini" + letters[n] 
  sequence(:last_name)  |n| "Pollux" + letters[n] 
  sequence(:profile_name)  |n| "GeminiPollux" + letters[n]  
  sequence(:email)  |n| "geminipollus" + letters[n] + "@hotmail.co.uk" 
end

或者干脆用ascii转换,或者用Faker gem

【讨论】:

以上是关于如何使用工厂女孩创建唯一的字符串(没有数字)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在javascript中获取纯粹唯一的数字[重复]

如何创建具有最大元素的唯一键数组?

工厂女孩在安全回调之前

如何将唯一数字附加到字符串列表

如何在 laravel 的配置文件工厂中提供唯一的 user_id

java如何对一个字符串生成唯一的编码