Rake task to truncate all tables in Rails 3
I've found this via google, and then I got a much simpler solution than the one approved, so here it is: Use the database_cleaner gem. Here're the steps.
In your Gemfile (execute bundle after modifying):
gem 'database_cleaner' # you might want to limit this to the dev and staging group
With that gem in place, the statement DatabaseCleaner.clean_with :truncation
will truncate the database. Adding it to a rake task is trivial:
# tasks/db/clean.rakenamespace :db do desc "Truncate all existing data" task :truncate => "db:load_config" do DatabaseCleaner.clean_with :truncation endend
That's it. You can also use the DatabaseCleaner.clean_with :truncation
line inside your db/seeds.rb
file directly so that you don't forget to truncate the database before seeding.
So I edited the linked example into this:
namespace :db do desc "Truncate all existing data" task :truncate => "db:load_config" do begin config = ActiveRecord::Base.configurations[::Rails.env] ActiveRecord::Base.establish_connection case config["adapter"] when "mysql", "postgresql" ActiveRecord::Base.connection.tables.each do |table| ActiveRecord::Base.connection.execute("TRUNCATE #{table}") end when "sqlite", "sqlite3" ActiveRecord::Base.connection.tables.each do |table| ActiveRecord::Base.connection.execute("DELETE FROM #{table}") ActiveRecord::Base.connection.execute("DELETE FROM sqlite_sequence where name='#{table}'") end ActiveRecord::Base.connection.execute("VACUUM") end end endend
This example is based on Chris Ledet's code bellow (thanks) and works with Rails 3.X.
Thanks for all hints.
According to Chris Ledet answer, this becomes much simpler:
ActiveRecord::Base.connection.tables.each do |table| ActiveRecord::Base.connection.execute("TRUNCATE TABLE #{table};")end