【问题标题】:Why only first page results get exported to csv?为什么只有首页结果会导出到 csv?
【发布时间】:2018-01-19 08:35:04
【问题描述】:

我正在尝试在导出为 CSV 时获取 ALL 过滤结果。

我的to_csv 工作正常,我怀疑与我的控制器有关。

使用 kaminari、ransack 进行搜索,但似乎使用 ransack 甚至导出到 csv 都很少见。
非常感谢任何帮助。

controller.rb

@search = Order.includes(:user, :order_items).ransack(params[:q])
@orders = @search.result.order(created_at: :desc).page(params[:page])

respond_to do  
  |format|
  format.html
  format.csv { send_data @orders.to_csv, filename: "orders-#{DateTime.now.strftime("%d%m%Y%H%M")}.csv" }
end

view.html.haml

= link_to 'Download as CSV', a_o_path(request.params.merge(format: 'csv')), { class: 'btn btn-primary', style: 'float: right;' }

【问题讨论】:

  • 您正在合并请求参数对吗?所以 q 参数也会被提交,导致 Ransack 在渲染 csv 之前执行搜索。你为什么不直接打电话:a_o_path(:format => :csv)
  • @bo-oz 抱歉,这似乎不起作用。请求合并是为了得到过滤后的结果。
  • 是的,但是您需要摆脱导致 kaminari 启动的参数。如果您要调试对控制器方法的调用,您会看到 @orders 仅包含第一个 x订单,由于分页。然后将其传递给 csv 视图。你得到的正是你想要的。

标签: ruby-on-rails csv ransack kaminari


【解决方案1】:

您可以使用 ransack 和 kaminari 执行此操作,但您需要稍微更新一下您的控制器。以下是您目前所拥有的:

format.csv { send_data @orders.to_csv, filename: "orders-#{DateTime.now.strftime("%d%m%Y%H%M")}.csv" }

当你的控制器到达这里时,@orders 已被 ransack 过滤,但它也已被 kaminari 分页。由于您在某些情况下使用 html 进行响应,而在其他情况下使用 csv 进行响应,因此当您使用 csv 进行响应时,您需要做一些稍微不同的事情。

这是我会尝试的:

@search = Order.includes(:user, :order_items).ransack(params[:q])
@orders = @search.result.order(created_at: :desc)

respond_to do |format|
  format.html { @orders = @orders.page(params[:page]) }
  format.csv { send_data @orders.to_csv, filename: "orders-#{DateTime.now.strftime("%d%m%Y%H%M")}.csv" }
end

基本上,您只在使用 html 响应时对查询进行分页。当请求 csv 时,所有订单仍然存在。

【讨论】:

    猜你喜欢
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多