2012-12-23 31 views
1

我想用gems populator和faker填充我的數據庫。我只是跟着railscast tutorial。如果我只按照教程,我的代碼如下所示:Rails應用程序中的Gems populator和faker調用錯誤

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太舊?

在此先感謝!

回答

1

我已經碰到了相同的問題超過幾次。

基本上,使用填充器的寶石時,在一個鏡頭當您使用法克爾或填充器爲您遇到問題唯一列設置值創建插入查詢結果。

兩個寶石有排列生成之類的電子郵件和名稱的數量有限,雖然這是相當大的 - 總是有是一個概率,他們將拋出相同的名稱/電子郵件的兩倍。

由於您使用的填充器,沒有什麼可以做,以解決這個問題。

的替代,但是較慢的方法是使用活動記錄,並用手添加它們。

在這種情況下,您可能想嘗試一個循環,它將在嘗試使用它保存新記錄之前驗證名稱的唯一性。像這樣:

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