Во-первых, извините за эссе, я пытаюсь не предоставлять никакого реального кода приложения и надеюсь, что есть какое-то логическое объяснение только потому, что проблема настолько странная.
Я потратил последние 2 дня на отладкуВ некотором коде, который работает в 95% случаев, ошибка сначала казалась простой для отладки, но теперь я почесал голову без ответа.
Некоторый фон
Мы работаем: Ruby 1.8.6, Rails 2.3.2 и Postgresql 8
Нам все еще нужно перейти на 2.3.8, поэтому, если решение не лежит в обновлении до rails 2.3.8не советуйте мне;)
В двух словах
У нас есть скрипт, который сканирует файлы CSV.Я сохраняю все соответствующие столбцы в хэши по строкам, а затем перебираю хэши, вызывая различные модели и методы ActiveRecord для сохранения данных в нашей базе данных.
Проблема
Наиболее важные данные, которые должны быть сохранены, имеют вызовы методов, которые заключены в блок транзакции, поэтому, если возникают какие-либо ошибки, никакие данные не должны вставляться в наши основные таблицы.
Таблица вВ вопросе есть 2 внешних ключа, которые ОБА должны присутствовать для того, чтобы приложение rails функционировало должным образом.
Как я уже говорил, ~ 95% времени при обработке наших данных эти значения вставляются правильно.
В остальное ~ 5% времени одно значение внешнего ключа не сохраняется вообще и без веской причины.
Я сохранил поток сценариев и вывод объекта / переменной вфайл журнала и пошагово / тщательно изучил файл журнала для случаев, когда отсутствовал внешний ключ.
ОбъектВсе переменные / переменные, которые я использую в качестве внешних ключей, сообщались ActiveRecord как «сохраненные» в каждом случае, когда я проверял объекты после «сохранения».
Одна вещь, на которую стоит обратить внимание:значение, которое сохраняется в соответствующем столбце внешнего ключа, вычисляется за пределами блока транзакции, но я не понимаю, почему это будет проблемой, поскольку я могу вывести и использовать значение дальше по строке.
Упрощенный поток кода
#Returns ActiveRecord object
fk2_source_object = method_to_compute_fk2(x, y)
@logger.info fk2_source_object.inspect
begin
Transaction do
begin
fk1_source_object = FK1Model.new
#etc, etc.
fk1_source_object.save!
@logger.info fk1_source_object.inspect
object_in_question = ObjectInQuestion.new
object_in_question.fk1_source_object_id = fk1_source_object.id
#FK2 >> This is the value that does not reflect in the database!? even if i could inspect it and see an id after calling .save!.
object_in_question.fk2_source_object_id = fk2_source_object.id
begin
object_in_question.save!
#At this point it shows that the object has saved, all values have been set, but it does not reflect in the database?
@logger.info object_in_question.inspect
rescue
@Logger.error "error message"
raise ActiveRecord::Rollback
end
rescue
@Logger.error "error message"
raise ActiveRecord::Rollback
end
end
rescue Exception => e
@logger.error e.inspect
end
#etc, etc.
В настоящее время я хватаюсь за соломинку, собираюсь обернуть весь раздел в блок транзакций.
Iне могу воссоздать ошибку в моем окне разработки, честно говоря, если я перезапущу CSV-файлы на сервере, значения будут вставлены правильно во второй / третий раз.(Так что это не проблема источника данных)
Я начинаю беспокоиться, что это может быть проблема rails / postgresql 8?Я теряю сюжет или какие могут быть причины этого?