知らなかったので備忘まで。ただし万能ではないので用法用量を守って正しくお使いください。
環境
$ rails -v Rails 7.0.6 $ ruby -v ruby 3.0.5p211 (2022-11-24 revision ba5cf0f7c5) [arm64-darwin22]
どういうものか
Railsコンソールには --sandbox
というオプションがあり、DBにまつわる操作をexit時にロールバックしてくれる。
そのため、このオプションで立ち上げると不意にレコードを削除してしまったなどのときもロールバックが可能になる。
そのため、「コンソールでデータの確認だけをしたい」などのときに保険として使える。
実例
例えば下記のようなテーブルがあったとする
ActiveRecord::Schema[7.0].define(version: 2023_05_05_154155) do create_table "articles", force: :cascade do |t| t.text "body" t.string "title" t.datetime "created_at", null: false t.datetime "updated_at", null: false end end
そして、レコードを2つ用意する
Article.all.pluck(:id,:title) # Article Pluck (0.2ms) SELECT "articles"."id", "articles"."title" FROM "articles" #=> [[1, "test1"], [2, "sample2"]]
たとえばこのときに「titleがsample2のものだけ削除したいが、コマンドが正しいか確認したい」というときはsandboxで立ち上げる
$ bundle exec rails console --sandbox
実行すると以下のように表示され、exit時にロールバックする旨が表示される
Loading development environment in sandbox (Rails 7.0.6) Any modifications you make will be rolled back on exit
そのため削除をすると、exit時に以下のようにロールバックされる。実際に試す。
Article.where(title: "sample2").first.destroy # Article Load (0.1ms) SELECT "articles".* FROM "articles" WHERE "articles"."title" = ? ORDER BY "articles"."id" ASC LIMIT ? [["title", "sample2"], ["LIMIT", 1]] # TRANSACTION (0.0ms) SAVEPOINT active_record_1 # Article Destroy (2.6ms) DELETE FROM "articles" WHERE "articles"."id" = ? [["id", 2]] # TRANSACTION (0.0ms) RELEASE SAVEPOINT active_record_1 #=> #<Article:0x000000010ff35bf0 id: 2, body: "", title: "sample2", created_at: Sun, 09 May 2023 03:01:06.586639000 UTC +00:00, updated_at: Sun, 09 May 2023 03:01:06.586639000 UTC +00:00> Article Pluck (0.1ms) SELECT "articles"."id", "articles"."title" FROM "articles" #=> [[1, "test1"]] exit
exit時に特に何も表示されていないがレコードがロールバックされている
bin/rails c Loading development environment (Rails 7.0.6)
Article.all.pluck(:id,:title) # Article Pluck (0.3ms) SELECT "articles"."id", "articles"."title" FROM "articles" # => [[1, "test1"], [2, "sample2"]]
注意点
内部的にはロールバックをかけられる状態にするので長くコンソールを開くとロックがかかり、通常のDB操作に影響が出ることがあるので気をつけること。(詳しくは参考リンク参照のこと)