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

标签 ruby-on-rails ruby postgresql

我遇到过这样的情况:我的 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 上,特别注意 BEGINCOMMITROLLBACK 语句何时发生。 destroy 是否确实在断点之前提交?

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

相关文章:

ruby-on-rails - 如何阻止 phusion 乘客生成服务器重新启动?

ruby-on-rails - Rails seed.rb 作为管理员

ruby-on-rails - 通过Rails 3.2将Elasticsearch与acts_as_paranoid gem集成

ruby-on-rails - 没有模型的 Ruby on Rails - 如果数据 CRUD 由 webservices API 执行

ruby - Rails 4 和全局化不添加翻译

ruby-on-rails - 在将用户输入传递给 %x(执行它)之前,我应该如何清理用户输入?

sql - 从按两列分组的两个表中选择不匹配的行

ruby-on-rails - Rails 项目 : NoMethodError: undefined method `identifier' for String

ruby-on-rails - structure.sql 文件中的 search_path 被 rails db :migrate 修改

postgresql - 在 Postgresql 中插入自引用记录