我的情况是我在ruby中有一个已在数据库中删除的模型。该对象仍然存在于内存中。我想要一种方法来检查数据库中的对象是否仍然存在。
如果我调试代码,并在断点处停止,我可以通过sql查询和irb查看数据库中的对象。但是,在调试器中,我可以计算表达式并尝试过:
car.reload
Car.find(car.id)
Car.where(id: car.id)
所有这些都归还了一辆不存在的汽车。
我也在尝试使用ActiveModel :: Dirty并在调试器中尝试了这个:
car.changed?
返回false。
TLDNR:调试器中的所有符号都指向它存在。 Db说它不存在。
我已经用尽了调试器处于错误状态的选项。我有1000%的信心,问题是内存对象和数据库对象。
如何从代码中获取对象的真实状态?
答案 0 :(得分:2)
您是否在另一个帖子中执行destroy
?那么当你car.reload
时,你以前在同一个帖子中做过car.destroy
吗?
如果destroy
发生在其他地方,即通过不同的数据库会话,则事务可能尚未完成,因此从重新加载线程的角度来看,它仍然在数据库中。
在调试会话期间,如果您尝试在psql提示符中选择记录,该怎么办?如果你可以重新加载记录,psql几乎肯定会返回记录。例外情况是如果你正在进行某种类型的ActiveRecord缓存 - 那么psql可能不会返回记录,但你需要检查。
要尝试进一步排除故障,请在销毁发生后立即尝试使用以下命令记录或打印已打开的事务数:
ActiveRecord::Base.connection.open_transactions
另一个建议:在destroy
之前和之后以及断点之前添加记录器语句。还要将记录器级别设置为debug,以便可以查看数据库语句。在postgres上,请专门查看BEGIN
,COMMIT
和ROLLBACK
语句何时发生。 destroy
实际上是在断点之前提交的吗?
答案 1 :(得分:1)
您可以car.destroyed?
查看对象是否已被销毁,并且只是在内存中闲置。 Doc:http://apidock.com/rails/ActiveRecord/Persistence/destroyed%3F