将两个日期之间的数据导出到csv文件中

时间:2013-02-13 14:00:19

标签: ruby-on-rails csv export

index.html.erb看起来如此: enter image description here

当用户按“应用”按钮时,我想将表格中的所有日期导出到csv文件中(并保存)。

我在reports_controller.rb的下一行中定义了

require 'csv'

我将ajax的所有参数传递给控制器​​(到函数更新)。

现在:

start_day = 用户选择的开始日期

end_year = 用户选择的结束年份

在我的更新功能中,我尝试创建csv文件。为了在两个日期之间搜索我的表,我创建了两个变量:start_date和end_date。

start_date = YYYY-MM-DD(while:YYYY是start_year,MM是start_month,DD是start_day)。

end_date类似于start_date(但使用:end_year,end_month和end_day)

所以这是我的更新功能:

def update
    @start_day = params[:start_day]
    @start_month = params[:start_month]
    @start_year = params[:start_year]

    @end_day = params[:end_day]
    @end_month = params[:end_month]
    @end_year = params[:end_year]

    # the format of start_date and end_date will be: "YYYY-MM-DD"
    @start_date = @start_year + "-" + @start_month + "-" + @start_day
    @end_date = @end_year + "-" + @end_month + "-" + @end_day

    # get all the transactions between start_date to end_date
    @transactions = BillingTransaction.find(:all, :conditions =>["date(created_at) BETWEEN ? AND ? ", @start_date, @end_date])

    # create the csv file
    csv_string = CSV.generate do |csv|
        # insert the headers
        csv << ["transaction_type", "payment_method"]
        # run all over the transactions
        @transactions.each do |user|
            # each of transactions is inserted into the csv file
            csv << [BillingTransaction.transaction_type, BillingTransaction.payment_method]
        end
    end         

    # save it as 'BillingTransaction.csv'
    send_data csv_string,
    :type => 'text/csv; charset=iso-8859-1; header=present',
    :disposition => "attachment; filename=BillingTransaction.csv" 
end

1 个答案:

答案 0 :(得分:4)

首先它不应该在update方法中,因为它打破了RESTful原则。您可以创建一个可以称为transactions的自定义方法,或类似的方法。

因为它没有修改任何内容并且会生成CSV,因此它可以作为GET方法使用。当然,您需要修改路线以使此方法可见。

从参数创建Date对象也是一个好主意,例如:

@start_date = Date.new(@start_year.to_i, @start_month.to_i, @start_day.to_i)
@end_date = Date.new(@end_year.to_i, @end_month.to_i, @end_day.to_i)

而不是构建字符串。

each区块中,您应该添加实际值:

@transactions.each do |transaction|
  # each of transactions is inserted into the csv file
  csv << [transaction.transaction_type, transaction.payment_method]
end

最后,您不需要使用实例变量(前缀为@符号)来表示您不希望在视图中使用的变量。

所以这里没有什么需要以@为前缀,