bundle exec rake db:seed 只播种了我一半的数据

bundle exec rake db:seed only seeds about half of my data

我根据使用 nokogiri 抓取的数据在 ruby 中创建了一个哈希数组。在我的一个名为 [:contributors] 的键中,我存储了另一个包含名称列表的数组。我已验证我的数据结构中的数据是正确的并且工作正常。

我正在尝试从我的 seeds.rb 文件中植入数据来填充我的 PostgreSQL 数据库,但由于某些原因它只填充了我的 [:contributors] 的大约一半。下面是我用来遍历我的数据结构以创建种子数据的代码:

@trending_array.each_with_index do |item, index|
  Repository.create(title: item[:title], description: item[:description], language: 
  item[:language])
  item[:contributors].each do |contributor|
    Contributor.create(username: contributor, repository_id: index + 1)
  end
end

我所有的迁移工作正常,我的模型验证是正确的。大约一半的数据种子正确,并且所有协会都有效,但它总是在 36quty 贡献者之后停止,总共 115qty。

关于为什么我的整个数据集没有正确播种的任何想法?

尝试使用 Repository.create!Contributor.create! 而不是 none-bang 版本,所以如果出现错误,它会被引发,你会收到一条消息错误。

我认为主要是 Contributor 模型的验证未通过,或者 index+1 未生成有效的 repository_id

非 bang 版本不会引发错误,它只是 returns false 或创建的记录(如果创建成功)。

您分配 repository_id 的方式不正确。当你第二次 运行 这个函数时会发生什么?索引字段将始终从 0 开始。因此您的代码将始终查找 ID 为 1 的存储库。

所以每次你 运行 这个脚本,即使它正在创建新的存储库。贡献者被分配到相同的存储库。如果您删除了前 115 条存储库记录,那么您的贡献者将不会被创建(因为它会尝试找到 ID 为 1 的存储库)。

假设您的关联是正确的(存储库 has_many 贡献者)

如何解决?

步骤 1.) 您不需要声明索引,因为索引总是从 0 开始,所以它不是很好或用于设置标识符。

@trending_array.each do |item|

步骤 2.) 将您创建的存储库存储到变量中。使以后操作和更新更容易

repository = Repository.create(title: item[:title], description: item[:description], language: item[:language])

步骤 3.) 使用您新创建的存储库变量来创建子贡献者。

repository.contributors.create(username: contributor)

这样就不需要 id,因为您明确使用刚刚创建的存储库来为该记录创建贡献者。

您的新区块应该如下所示:

@trending_array.each do |item|
  repository = Repository.create(title: item[:title], description: item[:description], language: item[:language])
  item[:contributors].each do |contributor|
    repository.contributors.create(username: contributor)
  end
end