【问题标题】:Rails: Background task for regular feedRails:常规提要的后台任务
【发布时间】:2018-09-04 02:12:27
【问题描述】:

我对现有应用程序有新要求,我想询问其他开发人员如何着手开发它。我想每 2 天导出一次 CSV 并提供我的销售团队提要,他们使用这些提要在指定的数据存储位置(例如谷歌驱动器)上批量导入。然后他们可以检查文件并进行上传等。

我想运行一个 Heroku 调度程序,它每 2 天运行一次并从应用程序导出数据,将文件以特定格式和特定​​标题保存到该存储。

我知道我可以编写一个生成格式的类方法,使用策略模式来获取特定的标头并使用 response_to 提供它并提供格式 csv,以便用户可以通过 URL 访问该文件,但我该如何编写创建文件并将其上传到我指定的特定位置的 rake 任务?

非常感谢任何方向

【问题讨论】:

    标签: ruby-on-rails file-upload export rake


    【解决方案1】:

    在 Rails 中,rake 任务通常存储在 lib/tasks 并具有 .rake 扩展名。对于 CSV 部分,您可以使用 Ruby 的 CSV API。生成 CSV 后,您可以将其保存在本地或上传到您想要的任何服务(例如 S3、Google Drive 等)。以 S3 为例:

    # lib/tasks/csv_tasks.rake
    
    namespace :csv do
      desc 'Generates new feed'
      task :feed do
        client = Aws::S3::Client.new(region: 'eu-west-1',
                                     access_key_id: 'access_key_id',
                                     secret_access_key: 'secret_access_key')
    
    
        feed_csv = CSV.generate do |csv|
          # headers
          csv << [:first_name, :last_name]
    
          # CSV rows
          Employee.find_each do |employee|
            csv << [employee.first_name, employee.last_name]
          end
        end
    
        client.put_object({
          body: feed_csv, 
          bucket: 'my_bucket', 
          key: 'feed.csv', 
        })
      end
    end
    

    然后在 Heroku 调度器中使用定义的任务rake csv:feed

    您也可以考虑为您的文件创建一个模型,以便保存它们的路径,然后在您的应用程序中轻松地显示它们。

    我建议您将 S3 或其他凭据保存在 secrets.yml 文件或凭据文件 (Rails 5.2+) 中。要使用适用于 Ruby 的 AWS 开发工具包,请将其添加到您的 Gemfile:

    gem 'aws-sdk', '~> 3'
    

    如果需要,在 rake 任务中需要它。有关如何使用 S3 和 ruby​​ 的更多信息,请阅读here

    【讨论】:

    • 您回答的是通用部分而不是特定部分:我如何编写 rake 任务 创建文件并将其上传到我指定的特定位置 ?
    • 请查看我的更新答案以获取有关该部分的建议。
    • 好的。我认为 OP 的问题是 Heroku 没有提供可以保存 csv 的文件系统,因此您需要在服务提供商(可能是 aws、cloudinary、google drive 或其他提供商)处在线保存它。这是棘手的部分。
    • 好的。以 3. 示例添加 S3。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    相关资源
    最近更新 更多