module ActionController::Live

def send_stream(filename:, disposition: "attachment", type: nil)

end
end
stream.write "#{subscriber.email_address},#{subscriber.updated_at}\n"
@subscribers.find_each do |subscriber|

stream.write "email_address,updated_at\n"
send_stream(filename: "subscribers.csv") do |stream|

Example of generating a csv export:

Valid values are 'inline' and 'attachment' (default).
* :disposition - specifies whether the file will be shown inline or downloaded.
If no content type is registered for the extension, the default type 'application/octet-stream' will be used.
If omitted, type will be inferred from the file extension specified in :filename.
You can specify either a string or a symbol for a registered type with Mime::Type.register, for example :json.
* :type - specifies an HTTP content type.
* :filename - suggests a filename for the browser to use.
Options:

don't want the entire file buffered in memory first. Similar to send_data, but where the data is generated live.
Sends a stream to the browser, which is helpful when you're generating exports or other running data where you
def send_stream(filename:, disposition: "attachment", type: nil)
  response.headers["Content-Type"] =
    (type.is_a?(Symbol) ? Mime[type].to_s : type) ||
    Mime::Type.lookup_by_extension(File.extname(filename).downcase.delete("."))&.to_s ||
    "application/octet-stream"
  response.headers["Content-Disposition"] =
    ActionDispatch::Http::ContentDisposition.format(disposition: disposition, filename: filename)
  yield response.stream
ensure
  response.stream.close
end