現象
stagingのRailsコンソールから新しいレコードを作って、画面に反映されるかを確認する作業をしていた。
request = SomeResource.new(...) request.save_by!(user) # => true
コンソール上では count も増えており、find_by でも作成したレコードが取得できる。一方、ブラウザで一覧画面を開くと、作成したはずのレコードがリストに含まれない。
原因
rails console を --sandbox 付きで起動していた。
--sandbox モードは、コンソールでの操作を1つのトランザクションに包んで終了時にROLLBACKする。書き込んだつもりのレコードは最初からCOMMITされていないため、別接続(ブラウザ)からは見えない。
console内では find_by も count も同一トランザクションから読んでいるため、書き込んだ直後のレコードが普通に取得できる。このため、console内では保存できているように見えるが、別接続からは見えない、という状態になる。
調査の経緯
Claudeから出てきた仮説はキャッシュ系に偏っていた。
- ブラウザ・CDNのレスポンスキャッシュ
- read replicaのレプリケーション遅延
- ETag・
Cache-Controlヘッダ - ブラウザ側の永続キャッシュ
いずれも該当しなかった。
自分側の仮説は「rails cでの確認方法がview側のロジックと違うのではないか」というものだった。Claudeで controller#index をconsole上でトレースすると、結果は毎回「該当レコードを含む」。一方、ブラウザの一覧では「含まない」。同じコードを同じDBに対して実行しているのに結果が違う、という状態が残った。
結局、Claudeのキャッシュ系仮説も、自分のviewロジック差異仮説も、いずれも外していた。
最終的に、コンソールが --sandbox で起動していたことに気づいた。書き込みは最初からCOMMITされておらず、controllerとconsoleの差ではなく、console側のトランザクションがそもそも残らない設定で起動していた、というだけのことだった。
チェックリスト
「console内では見えるのに別接続からは見えない」という現象が出ているときは、sandboxの可能性が高い。同様の現象は他のケースでも起きるので、合わせてチェック対象にしておく。
- console内で取得できるレコードが、別接続(ブラウザ・別console・psql等)から見えない → まず
--sandboxを疑う - consoleの起動メッセージとプロンプトの
(sandbox)を確認する - 同様のケース:別環境への接続、別tenant、別user権限、未commitのトランザクション
- console内の自分のreadは保存確認にならない。同一トランザクション内では見えて当たり前なので、保存検証は別セッションから行う
まとめ
rails console --sandboxで書き込むと、console内では見えるが別接続から見えない- 「console内で見える / 別接続で見えない」という現象を観測したら、まず
--sandboxを疑う - consoleの起動メッセージとプロンプトの
(sandbox)で判別できる - 手元のローカル情報(プロンプト、起動方法、環境変数)はAIエージェントからは見えない