2

我有一种情况,我有一个已在数据库中删除的 ruby​​ 模型。该对象仍然存在于内存中。我想要一种方法来检查数据库中的对象是否仍然存在。

如果我调试代码并在断点处停止,我可以通过 sql 查询和 irb 查看数据库中的对象。但是,在调试器中,我可以评估表达式并尝试过:

car.reload
Car.find(car.id)
Car.where(id: car.id)

所有这些都返回一辆不存在的汽车。

我也在尝试使用 ActiveModel::Dirty 并在调试器中尝试了这个:

car.changed?

这返回错误。

TLDNR:调试器中的所有标志都指向它存在。Db 说它不存在。

我已经用尽了调试器处于错误状态的选项。我 1000% 确信问题出在内存对象与数据库对象之间。

如何从代码中获取对象的真实状态?

4

2 回答 2

2

你在做destroy不同的线程吗?那么当你这样做时car.reload,你以前是否car.destroy在同一个线程中做过?

如果destroy发生在其他地方,即通过不同的数据库会话,则事务可能尚未完成,因此从重新加载线程的角度来看,它仍在数据库中。

在调试会话期间,如果您尝试在 psql 提示符中选择记录怎么办?如果可以重新加载记录,psql 几乎肯定会返回记录。例外情况是,如果您正在进行某种 ActiveRecord 缓存 - 那么 psql 可能不会返回记录,但您需要检查。

要尝试进一步解决此问题,请在销毁发生后立即尝试使用以下命令记录或打印打开事务的数量:

ActiveRecord::Base.connection.open_transactions

另一个建议:在断点之前和之后以及在断点之前添加记录器语句destroy。还将您的记录器级别设置为调试,以便您可以查看数据库语句。在 postgres 上,专门查找BEGINCOMMITROLLBACK语句何时发生。是destroy在断点之前实际提交的吗?

于 2013-09-12T19:49:24.647 回答
1

您可以car.destroyed?查看对象是否已被销毁并且仅在内存中徘徊。文档:http ://apidock.com/rails/ActiveRecord/Persistence/destroyed%3F

于 2013-09-12T18:55:41.873 回答