gpt4 book ai didi

ruby-on-rails - Rails 对象在内存中但不在数据库中

转载 作者:数据小太阳 更新时间:2023-10-29 08:48:56 24 4
gpt4 key购买 nike

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

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

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

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

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

car.changed?

这会返回错误。

TLDNR:调试器中的所有迹象都表明它存在。 Db 说它不存在。

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

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

最佳答案

您是否在不同的线程中执行destroy?那么,当您执行 car.reload 时,您之前是否在同一线程中执行过 car.destroy

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

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

要尝试进一步解决此问题,请在销毁发生后立即尝试使用以下方法记录或打印未结交易的数量:

ActiveRecord::Base.connection.open_transactions

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

关于ruby-on-rails - Rails 对象在内存中但不在数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18772120/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com