`

Rails创建定时任务

阅读更多

 

 

Task & Rexcel

最终生成的报表需要excel格式,我用了Rexcel这个插件,先写下一个task(/lib/task/task.rake)

namespace :reports do
  desc "my report"
  task :my_report => :environment do
     arr = ActiveRecord::Base.connection.execute("#{your sql}").to_a
    workbook = Rexcel::Workbook.new
    worksheet = workbook.add_worksheet("reports")
    worksheet.add_line(["col1", "col2", "col3"])
    worksheet.add_lines(arr)
    Rails.logger.info("===================begin to write excel")
    File.open("#{RAILS_ROOT}/public/uploads/reports/#{month}月报表.xls", "w") do |f|
      f.write(workbook.build)
    end 
  end
end

Crontab & whenever

cron是unix的一个系统工具,用来在后台执行一些定时任务,crontab就是定义这些定时任务的文件

crontab commands

  • crontab -e Edit your crontab file, or create one if it doesn’t already exist.
  • crontab -l Display your crontab file
  • crontab -r Remove your crontab file

whenever

whenever是一个用来生成可读性更好的crontab的gem

config/schedule.rb中写完任务

# 每个月1号凌晨4点执行任务
every '0 4 1 * *' do
  rake "reports:my_report"
end

在控制台直接执行whenver,得到原生的crontab line,放到部署应用的机器上

关于rake task传参

如果想在控制台手动执行task,也许需要传一些参数,写法是这样

desc "模版应用次数统计报表 -- 手动执行,输入月份"
task :my_task_by_params, [:arg1, :arg2] => :environment do |t, args|
  puts args.arg1
  puts args.arg2
  # your code ...
end

控制台执行RAILS_ENV=production rake my_task_by_params[1, 2]

如果用的是zsh的话,这个rake命令可能会出问题,记得用noglob,出处

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics