Rails のレコードが永続化され、同時に存在しないようにするにはどうすればよいでしょうか?

概要

レコードに添付されたファイルが見つからない理由を理解しようとしているので、after_save コールバック中にコード内の特定のポイントにブレークポイントを設定しました (これが発生するときに注意することが重要です)。その一時停止中にいくつかの呼び出しを行った場合の出力は次のとおりです。

0> self.inspect
=> #<BinSet id: 1131, name: "test upload", ...>

0> self.bins_table.download
=> Error: the evaluation of `self.bins_table.download` failed with the exception 'ActiveStorage::FileNotFoundError'

0> self.bins_table.attached?
=> true

0> self.reload
=> Error: the evaluation of `self.reload` failed with the exception 'Couldn't find BinSet with 'id'=1131'

0> self.id
=> 1131

0> self.persisted?
=> true

0> BinSet.find(1131)
=> Error: the evaluation of `BinSet.find(1131)` failed with the exception 'Couldn't find BinSet with 'id'=1131'

0> self.save!
=> true

0> self.id
=> 1131

0> BinSet.find(1131)
=> Error: the evaluation of `BinSet.find(1131)` failed with the exception 'Couldn't find BinSet with 'id'=1131'

これは after_save 中に発生していることを思い出してください。これはレコードが保存されたことを意味します。 ID が割り当てられ、自己永続化されていますか?は true ですが、データベース内で見つかりません。この時点での記録はどこにあるのでしょうか?

解決策

after_save のドキュメントを参照すると (リンクされたドキュメントは非推奨ですが、これは現在のコールバックに引き続き適用されます)、次のようになります。

操作のためにデータベース トランザクションを閉じる必要がある場合は、after_commit を使用します。