Rails console --sandbox
Occasionally, a particular bug or customer query will necessitate jumping into a Rails console connected to a live database, or a copy of the live database, that we wish to read from, but not change.
I was reminded today of an option that can be passed to the rails console command, -s, or --sandbox. This wraps the entire console command in a database transaction that will be rolled back when the console is terminated.
The implementation of the --sandbox option is actually very simple. When the console starts, begin_transaction is called on the ActiveRecord::Base connection. A hook is set up to trap at_exit, which will rollback any changes made within the sandbox. Here’s the implementation:
ActiveRecord::Base.connection.begin_transaction(joinable: false)
at_exit do
ActiveRecord::Base.connection.rollback_transaction
end
(source)
Effectively, this means that when a rails console --sandbox command is run, records can be added, removed, changed (and anything else that is processed inside a database transaction can be done), without it affecting any other part of the Rails application.