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,
--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
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.