如何使用工厂女孩创建唯一的字符串(没有数字)?
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
【讨论】:
以上是关于如何使用工厂女孩创建唯一的字符串(没有数字)?的主要内容,如果未能解决你的问题,请参考以下文章