2

データベースで削除された ruby​​ のモデルがある状況があります。オブジェクトはまだメモリに存在します。データベース内のオブジェクトがまだ存在するかどうかを確認する方法が必要です。

コードをデバッグし、ブレークポイントで停止すると、SQL クエリと irb を介してデータベース内のオブジェクトを確認できます。ただし、デバッガーでは、式を評価して試してみました。

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

そのすべてが存在しない車を返します。

私も ActiveModel::Dirty を使用しようとしており、デバッガーでこれを試しました:

car.changed?

これは false を返します。

TLDNR: デバッガー内のすべての兆候は、既存のものを示しています。Dbはそれが存在しないと言います。

デバッガーが悪い状態にあるというオプションを使い果たしました。問題がメモリ オブジェクトと db オブジェクトにあることは 1000% 確信しています。

オブジェクトの実際の状態をコードから取得するにはどうすればよいですか?

4

2 に答える 2

2

destroy別スレでやってんの?それで、あなたがするとき、あなたはcar.reload以前car.destroyに同じスレッドでしましたか?

他の場所、つまり別のデータベース セッションで発生している場合destroy、トランザクションがまだ終了していない可能性があるため、リロード スレッドの観点からは、トランザクションはまだデータベース内にあります。

デバッグ セッション中に、psql プロンプトでレコードを選択しようとするとどうなりますか? レコードをリロードできる場合、psql はほぼ確実にレコードを返します。例外は、ある種の ActiveRecord キャッシングが行われている場合です。その場合、psql はレコードを返さない可能性がありますが、確認する必要があります。

これをさらにトラブルシューティングするには、破棄が発生した直後に、次を使用して開いているトランザクションの数を記録または出力してみてください。

ActiveRecord::Base.connection.open_transactions

別の提案: ロガー ステートメントをdestroyブレークポイントの前後と直前に追加します。また、ロガー レベルをデバッグに設定して、データベース ステートメントを表示できるようにします。BEGINpostgres では、 、COMMIT、およびROLLBACKステートメントがいつ発生するかを特に探します。destroyブレークポイントの前に実際にコミットされていますか?

于 2013-09-12T19:49:24.647 に答える
1

car.destroyed?オブジェクトが破棄され、メモリ内のみにぶら下がっているだけかどうかを確認することができます。ドキュメント: http://apidock.com/rails/ActiveRecord/Persistence/destroyed%3F

于 2013-09-12T18:55:41.873 に答える