1

データベースに gems populator と faker を追加したいと考えています。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すると、関係はgemによって認識されないようです(undefined method repository_compact_id=for #<Populator::Record:0x0000010177ffb8>)しかし、RepositoryCompact部分以外のすべてをコメントアウトしても、レーキは中止されましたValidation failed: Name has already been taken

モデルと関連付けを正しく設定したと確信しています。明らかなエラーはありますか?
宝石populatorが古すぎるのでしょうか?

前もって感謝します!

4

1 に答える 1

1

同じ問題に何度も遭遇しました。

基本的に、Populator gem を使用すると、挿入するクエリが一発で作成されます。その結果、Faker または Populator を使用して一意の列に値を設定すると、問題が発生します。

両方の gem は、メールや名前などを生成するための順列の数が限られています。かなり大きいですが、同じ名前やメールを 2 回破棄する可能性が常にあります。

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
于 2013-01-25T12:09:57.773 に答える