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