Ruby Faker::Name.unique 验证失败

问题描述 投票:0回答:2

我有一个简单的工厂,我可以在其中创建具有唯一名称的类别

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)
显示了上面看到的错误。我做错了什么?

ruby
2个回答
2
投票

使用

sequence
作为 uniq 名称的 name_en 字段

FactoryGirl.define do
  factory :category do
    sequence :name_en, 'AAA0' do |sr|
      "#{Faker::Name.first_name}#{sr}"
    end
  end
end

0
投票

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 认为这种做法是一种反模式,正如他们在这篇博客文章

中所说的那样
© www.soinside.com 2019 - 2024. All rights reserved.