Rails faker gem 产生相同的产品名称

use*_*174 2 random ruby-on-rails faker ruby-on-rails-4

我正在尝试使用 Rails Faker gem 生成唯一的产品名称,以在数据库中创建示例项目模型。我已经多次使用 Faker,但由于某种原因我无法生成新的产品名称。我已经创建了 nameMaker 函数来避免可能的早期重复,但在一次插入后我就得到了一条记录失效。有谁知道我该如何解决这个问题?

种子.rb:

98.times do |n|
    name = Item.nameMaker
    description = Faker::Lorem.sentence(1)
    price = Item.priceMaker
    item = Item.create!(
        name: name,
        description: description,
        price: price)
    end
Run Code Online (Sandbox Code Playgroud)

项目.rb:

class Item < ActiveRecord::Base
    validates :name, presence: true, length: { maximum: 100 }
    validates :description, presence: true,
        length: { maximum: 1000 }
    VALID_PRICE_REGEX = /\A\d+(?:\.\d{0,3})?\z/
    validates :price, presence: true,
        :format => { with: VALID_PRICE_REGEX },
        :numericality => {:greater_than => 0}
    validates_uniqueness_of :name  

    def Item.nameMaker
        loop do
            name = Item.newName
            break if Item.find_by(name: name).nil?
        end
        return name
    end

    def Item.newName
        Faker::Commerce.product_name
    end 
end
Run Code Online (Sandbox Code Playgroud)

Han*_*lah 5

要获得唯一的name,请将伪造者括在括号中。例如

 name { Faker::Commerce.product_name }
Run Code Online (Sandbox Code Playgroud)

为了实现这一点,你还可以利用工厂女孩,当你想创建 98 种不同的物品时,你可以有类似的东西

    factories/item.rb

FactoryGirl.define do
  factory :item do
    name { Faker::Commerce.product_name }
    description { Faker::Lorem.sentence(1) }
    price Faker::Commerce.price
  end
end
Run Code Online (Sandbox Code Playgroud)

在你的规范文件中

let(:item) { create_list(:item, 98) }
Run Code Online (Sandbox Code Playgroud)