我有一个简单的工厂,我可以在其中创建具有唯一名称的类别
FactoryBot.define do
factory :category do
name_en Faker::Name.unique.first_name
end
end
在我的规范文件中,我使用它来创建类别:
create_list(:category,2)
现在我的问题是,我不断得到:
ActiveRecord::RecordInvalid Exception: Validation failed: Name en has already been taken
如果我调试并尝试自己调用
Faker::Name.unique.first_name
,它会为每个调用显示唯一的名称。然而,使用 create(:category)
显示了上面看到的错误。我做错了什么?
使用
sequence
作为 uniq 名称的 name_en 字段
FactoryGirl.define do
factory :category do
sequence :name_en, 'AAA0' do |sr|
"#{Faker::Name.first_name}#{sr}"
end
end
end
Faker 有一个
.unique
方法,应该可以满足你的需求。这就是您在示例中使用的那个。
FactoryBot.define do
factory :category do
name_en Faker::Name.unique.first_name
end
end
但是,我在创建很多记录时发现有问题。它可能会引发
Faker::UniqueGenerator::RetryLimitExceeded: Retry limit exceeded for name
错误。
您可以使用
sequence
方法:
FactoryBot.define do
factory :category do
sequence(:name_en) { |n| "#{Faker::Name.unique.first_name} #{n}" }
end
end
但首先,请确保您想要为所有新记录设置一个唯一的名称,而不是每次创建它们时都显式分配一个有意义的名称。 Thoughtbot 认为这种做法是一种反模式,正如他们在这篇博客文章
中所说的那样