为 Rails 的 Rake 添加 sandbox 模式

有时我们在 Rails 项目中要执行一些比较复杂的操作数据库的 rake tasks。可能是更新一批记录的属性或者批量删除数据。

而 Rails 没有像 console 一样给我们提供一个 sandbox。在 sandbox 模式下,当退出 console 的时,所有数据库操作都会回滚。

现在我们把这个模式移植到 rake 中,首先创建一个 sandbox.rake 从 console_sandbox.rb 中抄一段代码过来。

desc 'Run rake tasks with sandboxing'
task sandbox: :environment do

  # Start transaction
  ActiveRecord::Base.connection.begin_transaction(joinable: false)
  puts "🆒 Sandbox Mode: ON 🆒"

  # Run your task
  Rake.application.invoke_task(ARGV.delete_at(1))

  # Teardown
  at_exit do
    puts "Rolling back......"
    ActiveRecord::Base.connection.rollback_transaction
    puts "Roll back complete...."
  end
end

现在我们为 rake 准备好了 sandbox 容器了。以后我们可以这么执行 bin/rake sandbox <name of your rake task>

$ bin/rake sandbox employee_update_remove

原文链接

如果觉得我的文章对您有用,请在支付宝公益平台找个项目捐点钱。 @Victor Nov 27, 2018

奉献爱心