【问题标题】:bundle exec rake db:seed only seeds about half of my databundle exec rake db:seed only 种子大约一半的数据
【发布时间】:2020-08-10 07:41:00
【问题描述】:

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

我正在尝试从我的 seed.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

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

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

【问题讨论】:

  • 您不应该使用数组索引来设置外键标识符,因为索引都以 0 开头,这意味着您的代码在第二次运行时总是会失败。请查看我的答案以进行澄清。
  • 如果我的回答对您有所帮助,您需要接受答案。您会在我的答案的左上角找到执行此操作的按钮!询问您是否需要任何帮助:)

标签: ruby-on-rails ruby activerecord rails-activerecord seeding


【解决方案1】:

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

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

假设你的关联是正确的(Repository has_many Contributors)

如何解决?

步骤 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

【讨论】:

  • 好建议!谢谢——我意识到我的验证存在一些冲突,这些冲突阻止了该过程遍历我的数组中的每个项目。在没有验证的情况下,它可以正常工作,但是按照您的建议实现该块绝对是最佳实践,并且仍然使用模型验证。
【解决方案2】:

尝试使用Repository.create!Contributor.create! 而不是none-bang 版本,这样如果出现错误就会引发错误,并且您会收到错误消息。

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

non bang 版本不会引发错误,如果创建成功,它只会返回false 或创建的记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 2012-05-28
    相关资源
    最近更新 更多