あるRailsアプリケーションではファイルアップロードのジョブの途中で失敗すると、処理途中のレコードやアップロードしたファイルが残ります。
削除の手順はわかっています。 次の2つのコマンドでDBに残ったデータとアップロードしたファイルが消せます。
bin/rails runner 'Job.destroy_all' rm -rf tmp/upload-*
2つのコマンドを実行するのは手間です。 どうしましょうか?
Railsにはタスクという機能があります。
bin/rails server
やbin/rails db:prepare
などです。
これと同じような手順で実行出来ると良さそうです。
コマンドはそうですね。
bin/rails job:clean
で実行できたらいいと思います。
Railsにはタスクのテンプレートを生成するコマンドがあります。
今回のタスクはjob:clean
なので、次のように生成します。
bin/rails g task job clean
すると次のようなファイルが出来ます。
namespace :job do desc "TODO" task clean: :environment do end end
この中に必要な処理を書きます。
Job.destroy_all
はそのままなので簡単です
rm -rf tmp/upload-*
を少し頑張ってRubyで書き直します。
require 'fileutils' directory = "tmp/upload-*" list = Dir.glob Rails.root.join(directory) FileUtils.rm_rf(list)
材料が揃ったのでテンプレートを埋めます。
namespace :job do desc "Delete the remnants generated by the annotation upload job" task clean: :environment do # Delete Job records Job.destroy_all # Delete uploaded files require 'fileutils' directory = "tmp/upload-*" list = Dir.glob Rails.root.join(directory) FileUtils.rm_rf(list) end end
これでこれからは次のコマンドを実行すればゴミを削除出来ます。
bin/rails job:clean
かっこいい名前のコマンドで実行出来ると、うれしいですね。