ActiveRecord3.1/mysql2でTRUNCATE

DatabaseCleanerを使うと 複数データベース(各種RDBMSやMongoDB、CouchDBなどなど)に対応した方法でデータを削除できるんだけど、複数のDBにコネクションをはっている場合にはうまく動いてくれないことがあるらしい

でも自分の場合、mysql2でうまく動いてくれればそれでいいし、わざわざDatabaseCleanerを使う必要はないよなぁ…。ということで、ActiveRecord::ConnectionAdapters::Mysql2AdapterにTRUNCATEを発行してくれるメソッドを生やしてみた。実質DatabaseCleanerのコピペ。

module ActiveRecord
  module ConnectionAdapters
    class Mysql2Adapter < AbstractAdapter
      def truncate_tables
        tables_to_truncate.each do |table_name|
          truncate_table(table_name)
        end
      end
      def truncate_table(table_name)
        execute("TRUNCATE TABLE #{quote_table_name(table_name)};")
      end
      private
        def tables_to_truncate
          tables - views - ["schema_migrations"]
        end
        def views
          @views ||= select_values("select table_name from information_schema.views where table_schema = '#{current_database}'") rescue []
        end
    end
  end
end

次のようにtruncate_tablesを呼ぶと、ビューとschema_migrations以外に対してTRUNCATEを発行してくれる。

ActiveRecord::Base.connection.truncate_tables