Rails:常规Feed的后台任务

时间:2018-03-26 01:52:16

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

我对现有应用程序有新要求,我想问其他开发人员如何开发它。我想每两天导出一次CSV,并提供我们的销售团队供稿,用于批量导入指定的数据存储位置,例如google drive。然后他们可以检查文件并上传等。

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

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

真的很欣赏任何方向

1 个答案:

答案 0 :(得分:1)

在Rails中,rake任务通常存储在lib/tasks并具有.rake扩展名。对于CSV部分,您可以使用Ruby的CSV API。生成CSV后,您可以将其保存在本地或将其上传到您想要的任何服务(例如S3,Google云端硬盘等)。例如,参加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+)中。要使用AWS SDK for Ruby,请将其添加到您的Gemfile:

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

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