rails console --sandbox запускає консоль Rails у спеціальному режимі, де всі зміни, внесені в базу даних, автоматично скасовуються після завершення сеансу консолі. Цей прапорець надає безпечне середовище для тестування, де ви можете експериментувати з даними, не турбуючись про постійні зміни.
Я ніколи раніше не використовував опцію
--sandbox. Але останніми днями почав активно використовувати. Іноді буває так, що насмітивши в локальну базу даних треба її ресетити. Пісочниця дозволяє трохи зекономити часу. Всі дії в консолі обгорнуті в велику, розумну
атомарну транзакцію.
Як працює rails console --sandbox?
Використання команди
rails console --sandbox відкриває інтерактивну консоль в 'безпечному режимі'. Кожна операція з базою даних відбувається всередині транзакції. Після виходу з консолі всі транзакції автоматично відкатуються. Це дозволяє безпечно тестувати зміни та перевіряти код без ризику пошкодження даних у базі даних.
Приклад
rails console --sandbox
Loading development environment in sandbox (Rails 7.0.4.3)
Any modifications you make will be rolled back on exit
User.create!(name: 'R2D2', email: '[email protected]', password: 'Password666%', password_confirmation: 'Password666%')
irb(main):001:0> User.create!(name: 'R2D2', email: '[email protected]', passw
ord: 'Password666%', password_confirmation: 'Password666%')
TRANSACTION (0.8ms) BEGIN
TRANSACTION (0.6ms) SAVEPOINT active_record_1
User Exists? (3.8ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = $1 LIMIT $2 [["email", "[email protected]"], ["LIMIT", 1]]
User Create (5.4ms) INSERT INTO "users" ............
TRANSACTION (1.9ms) RELEASE SAVEPOINT active_record_1
=> #<User id: 41, email: "[email protected]", created_at: "2024-05-23 19:31:20.142273000 +0000", updated_at: "2024-05-23 19:31:20.142273000 +0000", name: "R2D2" ....>
Зверніть увагу на
TRANSACTION (1.9ms) RELEASE SAVEPOINT active_record_1
Виходимо з консолі (транзакція має видкатитись). Заходимо знову і перевіряємо User.last.id. В пісочниці ми створили юзера з id
41.
irb(main):002:0> exit
~/Documents/experiments/sandbox rails console
Loading development environment (Rails 7.0.4.3)
irb(main):001:0> User.last.id
User Load (1.9ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT $1 [["LIMIT", 1]]
=> 40
Бачимо, що останній збережений юзер - 40. Тобто, транзакція спрацювала.