运行 Rails 中的查询,如何将结果 (csv) 保存为列?

Run query in Rails, how to save results (csv) as column?

我将 Ruby 代码编写到 运行 连接到 API 并输出报告的查询。当我 运行 通过终端在本地将结果保存为 CSV 文件时。我想配置我的 Rails 应用程序来执行相同的操作,将输出保存为列或创建文件下载。执行此操作的最佳方法是什么?由于没有文件的列类型,我应该使用 CSV 做一个字符串吗?

目前我正在执行以下操作来创建 CSV:

CSV.open("LOCATION/FILENAME") do |csv|
FIELDS
csv << [FIELD NAMES]
end

您可以通过创建自己的 "renderer" 来响应您控制器中的 CSV 请求,其中您的典型请求以 HTML 或 JSON 响应,您也可以让您的控制器用 PDF 或 CSV 响应请求,这里有一些合理的文档:http://api.rubyonrails.org/classes/ActionController/Renderers.html.

简而言之,您可以这样做(来自文档):

创建 csv 渲染器:

ActionController::Renderers.add :csv do |obj, options|
  filename = options[:filename] || 'data'
  str = obj.respond_to?(:to_csv) ? obj.to_csv : obj.to_s
  send_data str, type: Mime[:csv],
    disposition: "attachment; filename=#{filename}.csv"
end

请注意,我们使用 Mime 作为 Rails 附带的 csv mime 类型。对于自定义渲染器,您需要使用 Mime::Type.register.

注册 MIME 类型

要在控制器操作中使用 csv 渲染器:

def show
  @csvable = Csvable.find(params[:id])
  respond_to do |format|
    format.html
    format.csv { render csv: @csvable, filename: @csvable.name }
  end
end

我考虑了很长时间,然后意识到我应该将 CSV 数据保存为哈希数组。在迁移中,我使用 t.json :array_of_hashes, default: [] 作为 table,因为数组不是有效的字段类型。 接下来,我将使用 this 建议在显示视图页面上将数组呈现为 table,并使用 J.P. 的建议将 table 呈现为 CSV下载。