我想用gems populator和faker填充我的数据库。我跟着railscast tutorial。如果我只是按照教程,我的代码如下:
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
太老了吗?
提前致谢!
答案 0 :(得分:1)
我遇到了同样的问题多次。
基本上,当使用Populator gem时,一次性创建要插入的查询,因此当您使用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