如何与工厂女孩一起创建独特的字符串(没有数字)?

时间:2014-01-03 13:10:13

标签: ruby-on-rails ruby factory-bot

或者是生成随机和唯一用户名所必需的外部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和email,但我的REGEX验证意味着名字和姓氏自动无效,因为它们中有一个数字。与独特性无关。

那我应该如何创建这些独特的名字?

3 个答案:

答案 0 :(得分:17)

infinite possible solutions生成随机字符串而不依赖第三方宝石。

这是一个

('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

如果随机因素太低,则可能会增加复杂性。

答案 1 :(得分:14)

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 ...

答案 2 :(得分:2)

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