Saurav Prakash
Saurav Prakash

Reputation: 1247

Rails: Background task for regular feed

I have a new requirement for an existing app and I wanted to ask other developers how to go about developing it. I want to export CSV every 2 days and provide my sales team feeds which they use to bulk import on a designated data storage location, say google drive. they can then check the file and do uploads etc.

I want to run a Heroku scheduler which runs every 2 days and exports data from the app, save the file in a specific format with a specific header to that storage.

I know that I can write a class method which generates the format, use strategy pattern to get a specific header and provide it using respond_to and give a format csv so a user can access that file through a URL but how can I write a rake task which creates the file and uploads it to the specific location I specify ?

Will really appreciate any direction

Upvotes: 0

Views: 91

Answers (1)

Enrai
Enrai

Reputation: 593

In Rails rake tasks are usually stored in lib/tasks and have .rake extension. For the CSV part, you can use the CSV API of Ruby. After generating a CSV you can save it locally or upload it to any service you want (e.g. S3, Google Drive, etc). For example, take 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

Then in Heroku scheduler use the defined task rake csv:feed

You might also consider having a model for your files in order to save their paths and then display them easily in your application.

I advise you to save your S3 or other credentials in the secrets.yml file or the credentials file (Rails 5.2+). To use the AWS SDK for Ruby, add this to your Gemfile:

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

And require it in the rake task, if needed. For more info about how to work with S3 and ruby, read here.

Upvotes: 1

Related Questions