Наполнитель и подделка драгоценных камней в приложении Rails вызывают ошибки

Я хочу заполнить свою базу данных с помощью гемблера и фейкера. Я просто следил за руководством по railscast. Если я просто буду следовать руководству, мой код будет выглядеть так:

namespace :db do
  desc "fill compact tables with sample data"
  task :populate => :environment do
    require 'populator'
    require 'faker'
    
    [RepositoryCompact, BuildCompact, JobCompact].each(&:delete_all)
    
    RepositoryCompact.populate 10 do |repository|
      repository.name = Faker::Name.name
      repository.description = Populator.sentences(1)
      repository.owner_name = Faker::Name.name
      repository.url = Faker::Internet.url

      i = 0 

       BuildCompact.populate 1..10 do |build|
        build.config = Populator.sentences(1..3)
        build.repository_compact_id = repository.id
        build.number = i
        i++
        build.result = 0 || 1
        build.finished_at = 2.years.ago..Time.now

         JobCompact.populate 1..5 do |job|
          job.build_compact_id = build.id
          job.allow_failure = 0 || 1
          #job.finished_at = build.finished_at-(2..100)
          job.language = [ruby, php, java, c, python, rubinius, jruby]
          job.version = [1.9 .. 2.5]
          job.result = 0 || 1
        end

       end

    end

  end
end

Если я запускаю rake db:populate, связь, похоже, не распознается драгоценным камнем (undefined method repository_compact_id=for #<Populator::Record:0x0000010177ffb8>). Но даже если закомментировать все, кроме части RepositoryCompact, грабли прерываются с помощью Validation failed: Name has already been taken

Я уверен, что правильно настроил модели и ассоциации. Это очевидная ошибка?
Может быть, самоцвет populator слишком стар?

Заранее спасибо!


person cruxi    schedule 23.12.2012    source источник


Ответы (1)


Я сталкивался с одной и той же проблемой более чем несколько раз.

По сути, при использовании гема Populator запрос для вставки создается за один раз, поэтому, когда вы используете Faker или Populator для установки значений для уникальных столбцов, вы сталкиваетесь с проблемой.

Оба драгоценных камня имеют ограниченное количество перестановок для создания таких вещей, как электронные письма и имена, и, хотя оно довольно велико, всегда есть вероятность, что они будут выбрасывать одно и то же имя / адрес электронной почты дважды.

Поскольку вы используете Populator, вы ничего не можете сделать, чтобы решить эту проблему.

Альтернативный, но более медленный подход — использовать Active Record и добавлять их вручную.

В этом случае вы можете попробовать цикл, который будет проверять уникальность имени, прежде чем пытаться сохранить с ним новую запись. Вот так:

5.times do
    repository = Repository.new
    begin
        name = Faker::Name.name
    end while Repository.where(name: name).exists?
    repository.name = name
    # set other values #
    repository.save!
end
person vvohra87    schedule 25.01.2013