0

各ユーザーが 1 つの店舗に対応するように、多数の店舗とユーザーをデータベースに入力したいと考えています。以下のコードの問題は、エラーValidation failed: Email has already been taken. が表示されることです。

namespace :db do
  desc "Fill database with sample data"
  task populate: :environment do
    make_stores
    make_users
  end
end

def make_stores
  50.times do 
    name = Faker::Company.name
    manager = Faker::Name.name
    address = Faker::Address.street_name
    Store.create!(name: name,
                  manager: manager,
                  address: address)
  end
end

def make_users
  stores = Store.all(limit: 8)

  99.times do |n|
    first_name  = Faker::Name.first_name
    last_name = Faker::Name.last_name
    email = "example-#{n+1}@example.org" 
    password  = "password"
    stores.each { |store| store.users.create!(first_name: first_name,
                  last_name: last_name,
                 email:    email,
                 password: password,
                 password_confirmation: password) }
  end
end
4

1 に答える 1

1

問題は、 を呼び出す前に電子メール変数を設定しているstores.eachため、8 つのストアすべてが同じ電子メールを持つユーザーを取得することです。

代わりに次のようにします。

def make_users
  stores = Store.all(limit: 8)

  99.times do |n|
    password  = "password"
    stores.each do |store|
      first_name  = Faker::Name.first_name
      last_name = Faker::Name.last_name
      email = "#{store.name.parameterize}-#{n+1}@example.org" 
      store.users.create!(first_name: first_name,
                  last_name: last_name,
                  email:    email,
                  password: password,
                  password_confirmation: password)
    end
  end
end

最初の 8 人のユーザーには のようなメールが届き(some-store-name)-1@example.org、次の 8 人のユーザーには、というように続きます(some-store-name)-2@example.org

于 2013-04-29T09:53:01.543 に答える