运行 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下载。
我将 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
.
要在控制器操作中使用 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下载。