@ledsun blog

無味の味は佳境に入らざればすなわち知れず

Railsのタスクを作成する

あるRailsアプリケーションではファイルアップロードのジョブの途中で失敗すると、処理途中のレコードやアップロードしたファイルが残ります。

削除の手順はわかっています。 次の2つのコマンドでDBに残ったデータとアップロードしたファイルが消せます。

bin/rails runner 'Job.destroy_all'
rm -rf tmp/upload-*

2つのコマンドを実行するのは手間です。 どうしましょうか?

Railsにはタスクという機能があります。 bin/rails serverbin/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

かっこいい名前のコマンドで実行出来ると、うれしいですね。