コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Rails ConsoleにはSandboxというオプションがある

知らなかったので備忘まで。ただし万能ではないので用法用量を守って正しくお使いください。

環境

$ 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操作に影響が出ることがあるので気をつけること。(詳しくは参考リンク参照のこと)

参考リンク