Reputation: 13901
Is there anyway to write the following code in Ruby without writing the file to disk?
temp_file = 'path/to/file.csv'
users = [[email protected], [email protected]]
CSV.open(temp_file, "w") do |csv|
csv << data_for_report
end
Reports.sendreport users temp_file
File.delete(temp_file)
The Reports.sendreport attaches a file and sends an email, so it needs to be a file...
Upvotes: 26
Views: 18363
Reputation: 667
You can also use CSV.generate
:
result = CSV.generate do |csv|
csv << data_for_report
end
It returns a string
Upvotes: 0
Reputation: 345
temp_file = CSV.generate do |csv|
csv << data_for_report
end
Reports.sendreport users temp_file
Upvotes: 5
Reputation: 25641
With your current code that's not possible, if your code would use file pointers/handles instead you can do the following:
require 'csv'
require 'stringio'
data_for_report = [1,2,3,4]
temp_file = StringIO.new # creates a fake file as string.
CSV.new(temp_file, "w") do |csv|
csv << data_for_report
end
The key problem why it isn't working for your usecase is the line Reports.report users temp_file
If that accepts a handle instead of a string it'll work.
See also this SO: https://stackoverflow.com/a/19110958/887836
Upvotes: 3
Reputation: 27855
You could use Tempfile
.
Tempfile
writes the file to disc, so it does not fit your request.
But I think Tempfile provides some features you need:
When a Tempfile object is garbage collected, or when the Ruby interpreter exits, its associated temporary file is automatically deleted.
Example:
require 'tempfile'
require 'csv'
data_for_report = [1,2,3,4]
temp_file = Tempfile.new('foo')
CSV.open(temp_file, "w") do |csv|
csv << data_for_report
end
Upvotes: 21
Reputation: 160191
Try one of the mmap gems. If the library only takes a filename, that's your option.
If it can accept a file-like object, however, you can use a StringIO.
You might consider changing whatever Reports
is, making it more general-purpose. It depends on what it's using to create its mail message–this might be trivial.
Upvotes: 2