расслоение exe c грабли дБ: семена только семена около половины моих данных - PullRequest
1 голос
/ 26 апреля 2020

Я создал массив хэшей в ruby из данных, которые я очистил с помощью nokogiri. В одном из моих ключей с именем [: contributors] я хранил другой массив, содержащий список имен. Я проверил, что данные в моей структуре данных верны и работают правильно.

Я пытаюсь заполнить данные из моего файла seed.rb, чтобы заполнить мою базу данных PostgreSQL, но по какой-то причине она заполняется только около половины моих [: авторов]. Ниже приведен код, который я использовал для итерации своей структуры данных для создания заполненных данных:

@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-й.

Есть какие-нибудь идеи относительно того, почему весь мой набор данных не заполняется должным образом?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Способ назначения repository_id неверен. Что происходит, когда вы запускаете эту функцию во второй раз? Поле индекса всегда будет начинаться с 0. Таким образом, ваш код всегда будет искать репозиторий с идентификатором 1.

Так что каждый раз, когда вы запускаете этот скрипт, даже если он создает новые репозитории. Участники размещаются в тех же репозиториях. И если вы удалили эти первые 115 записей репозитория, то ваш участник не будет создан (поскольку он попытается найти репозиторий с идентификатором 1).

Предполагается, что ваши ассоциации верны (репозиторий 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)

Таким образом, идентификаторы не нужны, так как вы просто используете репозиторий, который вы только что создали для создания участников для этой записи.

Ваш новый блок должен выглядеть следующим образом:

@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
0 голосов
/ 27 апреля 2020

Попробуйте использовать Repository.create! и Contributor.create! вместо версии без взрыва, поэтому, если возникнет ошибка, она будет поднята, и вы получите сообщение об ошибке.

в основном я думаю, что валидация модели Contributor не проходит, или index+1 не приводит к действительной repository_id.

версия без взрыва не вызывает и не выдает ошибку, а просто возвращает false или созданная запись, если она была успешно создана.

...