ActiveRecord不保存外键?真的很奇怪?

时间:2011-08-12 08:27:13

标签: ruby-on-rails ruby debugging activerecord transactions

首先,对于这篇文章感到抱歉,我试图不提供任何实际的应用程序代码,希望有一些合乎逻辑的解释只是因为问题很奇怪。

过去两天我花了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的问题? 我是否会失去情节或可能是什么原因?

0 个答案:

没有答案