如何创建动态的csv导出文件?

时间:2019-03-28 11:37:18

标签: ruby-on-rails ruby csv export-to-csv

我已经创建了一个简单的csv导出生成器,但是希望能够传递created_at参数,然后基于2个日期导出并在所选日期之间导出记录。

查看:

<%= date_select :start_date, @start_date%>
<%= date_select :end_date, @end_date %>
<%= link_to("Generate Report", report_path(format: :csv) %>

续:

  def order_report
    @start_date = params[:start_date]
    @end_date = params[:end_date]
    @user_orders = Order.where(seller_id: current_user).where(order_status: 2).where(["date(created_at) BETWEEN ? AND ? ", @start_date, @end_date])

    respond_to do |format|
      format.html
      format.csv { send_data @user_orders.to_csv, filename: "orders-#{Date.today}.csv" }
    end
  end

型号:

def self.to_csv
    CSV.generate do |csv|
      csv << %w{ id created_at order_type order_price }
      all.each do |order|
        csv << [order.id, order.ctreated_at, order.order_type, order.order_price ]
      end
    end
  end

但是结果为NULL:

  

选择“ orders”。*从“ orders”中的“ orders”中。“ seller_id” = $ 1 AND   “ orders”。“ order_status” = $ 2 AND(date(created_at)在NULL AND之间   NULL)

当我导出时,除了标题外什么也不会导出。

我如何成功做到这一点?

1 个答案:

答案 0 :(得分:0)

基本上,当您单击任何链接时,它都会发送get请求。要在get请求中传递参数,您需要使用query parameter

有很多传递参数的方法,但我将向您展示简单的路径

简单的解决方案是替换您的代码以使用表单并提交

<%= form_tag report_path(format: :csv), method: :get do %>
  <%= date_select :start_date, @start_date%>
  <%= date_select :end_date, @end_date %>
  <%= submit_button "Generate Report" %>
<% end %>

如果您不想使用表格,我可以更新答案以提供其他解决方案。