Arhn - архитектура программирования

ActiveRecord или Postgresql задают неверный идентификатор при создании новой записи

Я использую Rails 5.1 с Postgresql 9.6.9 на бесплатном уровне Heroku.

Недавно я использовал задачу rake с файлами csv, чтобы попытаться создать пару пакетов или записей. Затем я хотел протестировать внешний интерфейс и просто убедиться, что мои формы работают так же, как в процессе разработки.

Однако, когда я пошел, чтобы добавить новую запись с формой, я продолжал получать ошибку 500. Когда я проверяю свои журналы Heroku, я получаю эту ошибку.

ActiveRecord::RecordNotUnique (PG::UniqueViolation: ОШИБКА: повторяющееся значение ключа нарушает уникальное ограничение «games_pkey»

В нем будет указан идентификатор, который он пытался использовать, который будет более низким идентификатором, который использовался, когда я импортировал записи через задачу rake и файл csv.

Я подтвердил, что это действительно была проблема, постоянно пытаясь использовать мою форму для создания записи, которая, наконец, прошла примерно после 20 попыток и получила правильный следующий идентификатор.

Я не уверен, что это ошибка, вызванная Postgres или Rails. Это явно началось, когда я начал использовать задачу rake и файл csv. В файле csv есть атрибут ID, который использовался для простой проверки обновления или создания нового файла, но, возможно, это было моей причиной.

Любые советы о том, как предотвратить эту ошибку, были бы замечательны, так как я также загрузил другие файлы csv для других моделей еще большими партиями. Я хотел бы продолжать делать это, но только если я смогу избежать этой ошибки, чтобы я мог добавить одну или две с помощью простой формы, которая у меня есть, когда это возможно.

Спасибо за помощь.

Вот код задачи rask, который, возможно, вызывает проблему:

CSV.foreach(filename, {col_sep: ";", headers: true}) do |row|
  game_hash = row.to_h
  game = Game.find_by(id: game_hash["id"])

  if(!game)
    game = Game.create(game_hash)
  else
    game.update(game_hash)
  end
end

Ответы:


1

Если проблема связана с id в game_hash, я бы попытался удалить это как:

CSV.foreach(filename, {col_sep: ";", headers: true}) do |row|
  game_hash = row.to_h
  game = Game.find_by(id: game_hash["id"])

  #remove the id from the hash
  game_hash.delete :id

  if(!game)
    game = Game.create(game_hash)
  else
    game.update(game_hash)
  end
end

Это должно удалить id перед созданием новой игры.

06.08.2018
  • Я сейчас попробовал это. Я могу подтвердить, что это не работает. У меня все еще та же проблема. похоже, это проблема ActiveRecord или Postgresql. Я не уверен, какой из них устанавливает идентификатор или как это делается под капотом, поэтому не уверен, какой из них или, возможно, оба виноваты. 06.08.2018
  • Хм, я не уверен, но возможно ли, что это происходит из-за того, что ваши ключи не символизированы? Вы можете попробовать сделать game_hash.symbolize_keys! после строки 2 06.08.2018
  • Вам также придется найти game_hash[:id]. 06.08.2018
  • Это сделало это! Сделав символы клавиш, это устранило мою ошибку. Я чувствую себя идиотом. Но ты только что сделал мне ночь. Большое тебе спасибо. 06.08.2018
  • Без проблем. Я уверен, что мы все были там :) 06.08.2018
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..