我遇到过这样的情况:我的 ruby 模型已在数据库中删除。该对象仍然存在于内存中。我想要一种方法来检查数据库中的对象是否仍然存在。
如果我调试代码并在断点处停止,我可以通过 sql 查询和 irb 查看数据库中的对象。但是,在调试器中,我可以评估表达式并尝试过:
car.reload
Car.find(car.id)
Car.where(id: car.id)
所有这些都返回一辆不存在的汽车。
我还尝试使用 ActiveModel::Dirty 并在调试器中尝试了这一点:
car.changed?
这会返回 false。
TLDNR:调试器中的所有迹象都表明它存在。数据库说它不存在。
我已经用尽了调试器处于不良状态的选项。我 1000% 确信问题出在内存对象与数据库对象上。
如何从代码中获取对象的真实状态?
最佳答案
您是否在不同的线程中进行销毁
?那么,当您执行 car.reload
时,您之前是否在同一线程中执行过 car.destroy
?
如果销毁
发生在其他地方,即在不同的数据库 session 上,则事务可能尚未完成,因此从重新加载线程的角度来看,它仍然在数据库中。
在调试 session 期间,如果您尝试在 psql 提示符中选择记录会怎样?如果您可以重新加载记录,psql 几乎肯定会返回该记录。异常(exception)情况是,如果您正在进行某种 ActiveRecord 缓存 - 那么 psql 可能不会返回记录,但您需要检查。
要尝试进一步解决此问题,请在销毁发生后立即尝试使用以下方法记录或打印打开的事务数:
ActiveRecord::Base.connection.open_transactions
另一个建议:在 destroy
之前和之后以及断点之前添加记录器语句。还将记录器级别设置为调试,以便您可以看到数据库语句。在 postgres 上,特别注意 BEGIN
、COMMIT
和 ROLLBACK
语句何时发生。 destroy
是否确实在断点之前提交?
关于ruby-on-rails - Rails 对象位于内存中但不在数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18772120/