1. Создайте модель, которая содержит экспортированный файл
# app/models/csv_export.rb
class CsvExport < ApplicationRecord
has_one_attached :file
# ...
end
. Настройте ActiveStorage, чтобы он использовал S3 в качестве поставщика. См. https://medium.com/alturasoluciones/setting-up-rails-5-active-storage-with-amazon-s3-3d158cf021ff
2. Создайте задание на экспорт, которое создает новый CsvExport с данными
# app/jobs/csv_export_job.rb
require 'csv'
class CsvExportJob < ApplicationJob
queue_as :default
def perform(csv_export_id)
csv_export = CsvExport.find_by(id: csv_export_id)
csv_export.file.attach \
io: StringIO.new(csv_string), # add csv_string call here
filename: filename
# ...
end
private
# ...
CSV_COLUMNS = %w[id name email].freeze
def csv_string
CSV.generate(headers: true) do |csv|
csv << CSV_COLUMNS
# or whatever data you want to export
User.all.each do |contact|
csv << CSV_COLUMNS.map { |col| contact.send(col) }
end
end
end
end
3. Триггерное задание
например, из действия контроллера
csv_export = CsvExport.create(status: :started)
CsvExportJob.perform_later csv_export.id
Я надеюсь, что эти примеры приведут вас в правильном направлении. Если вам нужна подробная помощь, вы можете посмотреть эту статью https://railsbyexample.com/export-records-to-csv-files-using-activestorage/