ActiveRecord не сохраняет внешний ключ? Очень странно? - PullRequest
1 голос
/ 12 августа 2011

Во-первых, извините за эссе, я пытаюсь не предоставлять никакого реального кода приложения и надеюсь, что есть какое-то логическое объяснение только потому, что проблема настолько странная.

Я потратил последние 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?Я теряю сюжет или какие могут быть причины этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...