分页限制了我的csv导出

时间:2018-08-23 18:37:51

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

我在我的应用程序中添加了csv导出和分页功能。

parent.rb

    CSV_HEADER = %w[parent_1_firstname parent_1_lastname address]
    def self.to_csv
        CSV.generate do |csv|
        csv << CSV_HEADER
        all.each do |parent|
      csv << [
        parent.parent_1_firstname, 
        parent.parent_1_lastname, 
        parent.address

      ]
    end
   end
  end

controller.rb

def main_admin
        require 'csv'

        add_breadcrumb "Admin"
    @filterrific = initialize_filterrific(
      Parent,
      params[:filterrific],
      select_options: {
        with_status: Parent.options_for_status
            }
    )   or return   
    @parents = @filterrific.find.paginate(:page => params[:page], :per_page => 10)

    respond_to do |format|
      format.html
      format.js
      format.csv { send_data @parents.to_csv }
    end
    rescue ActiveRecord::RecordNotFound => e
        puts "Had to reset filterrific params: #{ e.message }"
        redirect_to(reset_filterrific_url(format: :html)) and return
    end

我面临的问题是当我单击main_admin.html.erb页面上的Download CSV时。下载的CSV只是前10个父级,但不止于此。像大约300位父母一样。我无法解决问题。请帮助。

更新

if params[:format] == 'csv' then @filterrific.find.paginate(:page => params[:page], :per_page => 10)
    respond_to do |format|
        format.csv { send_data @parents.to_csv }
    else 
    @parents = @filterrific.find.paginate(:page => params[:page], :per_page => 10)
   respond_to do |format|
      format.html
      format.js
    end 

2 个答案:

答案 0 :(得分:0)

您已经使单个控制器动作响应csv,html或js,这很好,但是您只能处理代表所有父项的单个对象-@parents。您的@parents实例变量始终在操作的所有三个响应者中分页。要解决此问题,您将需要使用父级的第二种表示形式,即父级的 all 来进行CSV导出:

respond_to do |format|
  format.html 
  format.js
  format.csv { send_data Parent.all.to_csv }
end

如果需要,别忘了重新添加Filterific逻辑。

应注意,在此示例中,即使不使用CSV导出,也要创建@parents对象,因此应将其移到html和js响应器中以停止额外的操作不必要的查询。

答案 1 :(得分:0)

将代码更改为仅在格式不是csv的情况下使用分页

@parents = @filterrific.find
@parents = @parents.paginate(:page => params[:page], :per_page => 10) unless request.format == 'csv' #does pagination if not csv format

respond_to do |format|
  format.html
  format.js
  format.csv { send_data @parents.to_csv }
end
相关问题