Rails定时Feed后台任务:每2天导出CSV至Google Drive方案咨询
我刚好做过类似的需求,给你一套完整的可落地实现方案,一步步来确保能跑通:
完整实现方案
核心思路是:用Heroku Scheduler触发Rake任务,任务中生成指定格式的CSV,再通过Google Drive API上传到指定文件夹。
步骤1:配置Google Drive API权限
首先得让你的Rails应用能合法访问Google Drive:
- 登录Google Cloud Console,创建一个新项目(或用现有项目)
- 搜索并启用「Google Drive API」
- 进入「IAM与管理」→「服务账号」,创建一个新的服务账号,给它起个名字比如
rails-drive-exporter - 给这个服务账号生成密钥:点击服务账号→「密钥」→「添加密钥」→「创建新密钥」,选择JSON格式,下载密钥文件(保存好,后面要用)
- 打开你的Google Drive,创建一个专门存储导出文件的文件夹,右键「共享」,把服务账号的邮箱(就是刚才创建服务账号时生成的那个类似
xxx@xxx.iam.gserviceaccount.com的邮箱)添加为编辑者
步骤2:添加必要的Gem
在你的Gemfile里加入两个关键Gem:
# 用于操作Google Drive gem 'google-drive-ruby' # 本地开发时管理环境变量(Heroku用自带的config vars) gem 'dotenv-rails', groups: [:development, :test]
然后执行bundle install安装。
步骤3:编写CSV生成逻辑
建议用服务类来封装导出逻辑,这样代码更清晰易维护。在app/services下创建sales_export_service.rb:
class SalesExportService # 生成符合要求的CSV内容 def self.generate_csv # 替换成你需要的特定表头 custom_headers = ["客户ID", "姓名", "联系邮箱", "跟进状态", "创建日期"] # 替换成你的业务查询逻辑,比如筛选需要导出的销售相关记录 target_records = Customer.where(needs_export: true) # 这里改成你的模型和条件 # 生成CSV字符串(Rails自带CSV库,无需额外依赖) CSV.generate(headers: true, encoding: 'UTF-8') do |csv| csv << custom_headers target_records.each do |record| # 按表头顺序填入对应字段,替换成你的模型属性 csv << [ record.id, record.full_name, record.contact_email, record.follow_up_status, record.created_at.strftime("%Y-%m-%d") ] end end end end
步骤4:编写定时执行的Rake任务
在lib/tasks下创建sales_export.rake文件,定义触发导出并上传的任务:
namespace :sales do desc "自动导出销售数据到Google Drive" task export_to_drive: :environment do require 'google_drive' begin # 1. 生成CSV内容 csv_content = SalesExportService.generate_csv # 2. 初始化Google Drive会话(用环境变量里的密钥) drive_session = GoogleDrive::Session.from_service_account_key( JSON.parse(ENV['GOOGLE_DRIVE_SERVICE_ACCOUNT_KEY']) ) # 3. 获取目标文件夹(用环境变量存文件夹ID) target_folder = drive_session.file_by_id(ENV['GOOGLE_DRIVE_TARGET_FOLDER_ID']) # 4. 生成带时间戳的文件名,避免覆盖 timestamp = Time.now.strftime("%Y%m%d_%H%M%S") file_name = "销售数据导出_#{timestamp}.csv" # 5. 上传CSV文件到Drive uploaded_file = target_folder.create_file( file_name, content: csv_content, content_type: 'text/csv' ) Rails.logger.info "✅ 成功导出文件:#{file_name},Drive文件ID:#{uploaded_file.id}" rescue StandardError => e # 异常处理:记录错误日志,建议添加邮件通知或异常监控 Rails.logger.error "❌ 销售数据导出失败:#{e.message}\n#{e.backtrace.join("\n")}" # 可选:用Action Mailer给管理员发失败通知 # AdminMailer.sales_export_failure_notice(e).deliver_later raise e # 让Heroku Scheduler记录失败状态 end end end
步骤5:配置Heroku环境变量
登录Heroku控制台,找到你的应用,进入「Settings」→「Config Vars」,添加两个变量:
GOOGLE_DRIVE_SERVICE_ACCOUNT_KEY:把之前下载的JSON密钥文件内容复制进去(注意是纯字符串,不要带换行)GOOGLE_DRIVE_TARGET_FOLDER_ID:目标Drive文件夹的ID(从文件夹URL里取,比如https://drive.google.com/drive/folders/xxxxxx里的xxxxxx)
步骤6:设置Heroku Scheduler定时任务
- 在Heroku控制台搜索并安装「Scheduler」插件(如果没装的话)
- 打开Scheduler,点击「Add job」
- 配置:
- Frequency:选择「Every 2 days」
- Command:填入
rails sales:export_to_drive - Dyno size:选「Free」就够(如果数据量特别大可以选Hobby)
- 保存任务即可
额外注意事项
- 本地测试:先在本地执行
bundle exec rake sales:export_to_drive,确认能生成CSV并上传到Drive - 性能优化:如果导出数据量很大,把
target_records.each改成target_records.find_each(batch_size: 1000),避免内存溢出 - 权限检查:确保服务账号确实有目标文件夹的编辑权限,不然会上传失败
- 日志查看:Heroku Scheduler的执行日志可以在应用的「Logs」里查看,方便排查问题
内容的提问来源于stack exchange,提问作者Saurav Prakash
相关产品推荐
相关产品推荐

