首先,对于这篇文章感到抱歉,我试图不提供任何实际的应用程序代码,希望有一些合乎逻辑的解释只是因为问题很奇怪。
过去两天我花了95%的时间来调试一些代码,这个错误起初很容易调试,但现在我发现自己没有回答。
一些背景
我们正在运行: Ruby 1.8.6,Rails 2.3.2& Postgresql 8
我们仍然需要迁移到2.3.8,所以除非解决方案在于升级到rails 2.3.8,否则不要告诉我;)
简而言之
我们有一个扫描CSV文件的脚本。我将所有相关列按行存储到哈希中,然后继续迭代哈希,调用各种ActiveRecord模型和方法将数据存储到我们的数据库中。
问题
需要保存的最重要的数据具有包含在Transaction块内的方法调用,因此如果引发任何错误,则不应将任何数据插入到我们的核心表中。
有问题的表有两个外键,两个外键需要存在才能使rails应用程序按预期运行。
就像我说的那样,〜95%的时间在处理我们的数据时,这些值会被正确插入。
另外~5%的时间根本没有保存一个外键值,并且没有充分的理由。
我已将脚本流和对象/变量输出保存到日志文件中,并逐步/仔细检查了缺少外键的实例的日志文件。
我用作外键的对象/变量在ActiveRecord中被报告为“保存”,在每次检查对象后都会被“保存”。
可能值得注意的一件事是,保存到有问题的外键列中的值是在Transaction块之外计算的 - 但我不明白为什么会出现这个问题,因为我可以输出并使用该行的更多值。
简化的代码流程
#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.
我正在抓住吸管,将整个部分包装到Transaction块中。
我无法在我的开发盒上重新创建错误,坦率地说,如果我重新运行服务器上的csv文件,则第二次/第三次正确插入值。 (所以这不是数据源问题)
我开始担心它可能是rails / postgresql 8的问题? 我是否会失去情节或可能是什么原因?