Railsで使っているDBに対するバッチ処理を行うのにrails runner 使ったりもしていたけど結局Rake使うのが一番捗ると今更気づいた今日このごろ。
##サンプル
- name,commentを持つMobというモデルを作成
- それに100件のデータを追加
- 奇数IDのみ表示
- 全削除
##作成 単なるScaffold
rails new SampleRake
cd SampleRake
rails g scaffold mob name comment
rake db:migrate
##Rakeタスクの作成
###rakeファイルの作成
rails g task mob_task add_100 show_odd remove_all
結果
create lib/tasks/mob_task.rake
namespace :mob_task do
desc "TODO"
task :add_100 => :environment do
end
desc "TODO"
task :show_odd => :environment do
end
desc "TODO"
task :remove_all => :environment do
end
end
###100件追加タスクの作成と実行
task :add_100 => :environment do
+ 100.times do |i|
+ mob = Mob.new
+ mob.name = "user_#{i}"
+ mob.comment = "sug" + "e" * i
+ mob.save
+ end
end
実行
rake mob_task:add100
結果(localhost:3000/mobs)
Name Comment
user_0 sug Show Edit Destroy
user_1 suge Show Edit Destroy
user_2 sugee Show Edit Destroy
user_3 sugeee Show Edit Destroy
・・・・
###奇数IDのみ出力
task :show_odd => :environment do
+ Mob.all.each do |m|
+ p "id:#{m.id}, name:#{m.name}, comment:#{m.comment}" if m.id % 2 == 1
+ end
end
実行
rake mob_task:show_odd
結果
"id:1, name:user_0, comment:sug"
"id:3, name:user_2, comment:sugee"
"id:5, name:user_4, comment:sugeeee"
"id:7, name:user_6, comment:sugeeeeee"
"id:9, name:user_8, comment:sugeeeeeeee"
###全削除
task :remove_all => :environment do
+ Mob.delete_all
end
実行
rake mob_task:remove_all
結果
消えてます。
他にもいろいろできそうなので活用してみます。