Ruby on rails 如何提高导出到CSV和XLS的速度

Ruby on rails 如何提高导出到CSV和XLS的速度,ruby-on-rails,ruby,excel,csv,ruby-on-rails-4,Ruby On Rails,Ruby,Excel,Csv,Ruby On Rails 4,我有一个Ruby模型,它有一个导出方法 class InfoVoucher < ActiveRecord::Base include ActiveModel::Serializers::JSON default_scope { order('voucher_created_at DESC') } def attributes instance_values end def self.export(data, options = {}) column

我有一个Ruby模型,它有一个导出方法

class InfoVoucher < ActiveRecord::Base
  include ActiveModel::Serializers::JSON

  default_scope { order('voucher_created_at DESC') }

  def attributes
    instance_values
  end

  def self.export(data, options = {})
    column_names = ["..","..","..","..",..]
    exported_col_names = ["Solicitud", "Inicio", "Final", "Duracion", "Pasajero", "Unidades", "Recargo", "Propina", "Costo", "Centro de costo", "Origen", "Destino",  "Proyecto", "Conductor", "Placas"]

    CSV.generate(options) do |csv|
      csv << exported_col_names

      data.each do |row_export|
        csv << row_export.attributes['attributes'].values_at(*column_names)
      end
    end
  end
end
如何改进此功能以使其尽可能高效

保持低内存 在处理庞大的数据集时,尽量少创建对象,从数据库中提取尽可能少的数据。您正在将
信息凭证
表中的每一列加载到
@last\u consult
中的各个
信息凭证
类中。这是不必要的

你可以做的一件事是@avlazarov所建议的;用于从数据库直接进入您感兴趣的列的嵌套数组

useful_data = InfoVoucher.where(@filters).pluck(*column_names)
对长时间运行的任务进行排队 您应该始终将这样的任务排队,以便稍后由工作人员处理。而且是受欢迎的选择


这样做的好处是,将执行用户的导出请求,并立即通知他们其请求已排队。完成后通过电子邮件将报告发送给他们。

是否尝试使用
pull
检索属性而不是构建AR对象@阿夫拉扎罗夫:我从来没听说过,我是个新手,它如何帮助我提高速度?我看到它允许筛选和查询,但我需要导出的结果已经在
数据
变量中筛选并准备好了
数据
到底是什么?@deefur我更新了问题以解释哪些数据is@avlazarov我对Ruby很陌生。在哪一行代码中创建了新的AR对象?此功能首先以HTML形式呈现结果,然后允许将其导出,如本文所述-
useful_data = InfoVoucher.where(@filters).pluck(*column_names)