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 部分之外的所有内容都注释掉,rake 也会中止Validation failed: Name has already been taken

我确信我设置了正确的模型和关联。有没有明显的错误?
会不会是宝石populator太旧了?

提前致谢!

4

1 回答 1

1

我已经多次遇到同样的问题。

基本上,当使用 Populator gem 时,要插入的查询是一次性创建的,因此当您使用 Faker 或 Populator 为唯一列设置值时会遇到问题。

这两个 gem 用于生成电子邮件和名称等内容的排列数量有限,虽然它相当大 - 它们总是有可能两次抛出相同的名称/电子邮件。

由于您使用的是 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 回答