リア充爆発日記

You don't even know what ria-ju really is.

Railsでstructure.sqlがやたらコンフリクトするとき

config.active_record.schema_format = :sqlにしたとき、DBがMySQLだと(そうでない場合もなるかもだけど)db:migrate:resetしたりすると、dumpのタイミングでタイムスタンプがずれるのでこんな感じの残念な差分が生まれる。

/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

--- Dump completed on 2015-01-05 12:17:15
+-- Dump completed on 2015-01-06 10:47:36
INSERT INTO schema_migrations (version) VALUES ('20140902084054');

INSERT INTO schema_migrations (version) VALUES ('20140903074012');

これをイチイチ手作業で対応するのはやってらんないし、この情報が重要だともあまり思えなかった(gitの履歴を追えばだいたいわかるし)ので、dumpのタイミングで消してしまうことにした。

具体的には以下の処理を書いた。
lib/tasks/dump.rake

namespace :db do
  namespace :structure do
    task :dump do
      path = Rails.root.join('db', 'structure.sql')
      sql = File.open(path).read.gsub(/^-- Dump completed on.*\n/, '').gsub(/-- Server version.*\n/, '')
      File.open(path, 'wb') {|f| f.puts sql }
    end
  end
end

この例ではServer versionも消している。マイナーバージョンとか開発者によって微妙に違ったりするのでこれも消した(バージョンを合わせたほうがいいとは思うけど)