【问题标题】:Pagination is limiting my csv export分页限制了我的 csv 导出
【发布时间】:2019-01-30 05:10:21
【问题描述】:

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

父.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 页面上单击下载 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 

【问题讨论】:

  • 您是否尝试删除分页?
  • @iGian 没有。我会尝试这样做。
  • @iGian 是的,如果我删除分页,它可以正常工作。但我需要分页
  • @iGian 知道如何修复它吗?
  • 尝试使用 if params[:format] == 'csv' then @parents=.... respond_with :csv else @parents = .... 等。

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


【解决方案1】:

将您的代码更改为仅在格式不是 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

【讨论】:

    【解决方案2】:

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

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

    如果需要,不要忘记重新添加 Filterific 逻辑。

    应该注意的是,在这个例子中,对于一个 CSV 导出,即使你不会使用它,你也会创建 @parents 对象,所以你应该把它移到 html 和 js 响应器中以停止额外的不必要的查询。

    【讨论】:

    • 我想通过添加过滤器来导出父母。不是我要导出我所有的父母。
    • nod 很可能您会将 Parent.all.to_csv 更改为 @filterrific.find.to_csv (删除分页组件)或 @filterific.find.map(& :to_csv) 或@filterific.all.map(&:to_csv)。我不熟悉那个 gem,所以我不知道确切的语法。
    • 我无法删除分页。我需要它。
    • HTML 和 JS 响应者的分页仍然存在。对于您的 CSV 响应者,它将不存在,这是您提出的问题 - 您的 CSV 正在分页,并且您只能获得文件中的前 10 个父母。
    • 我尝试了你建议的所有方法,每种情况下都有一个未定义的方法错误
    猜你喜欢
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2012-08-15
    • 2019-07-22
    相关资源
    最近更新 更多