Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 是否有任何优化的方法可以使用Rails导出超过100K条记录的CSV?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 是否有任何优化的方法可以使用Rails导出超过100K条记录的CSV?

Ruby on rails 是否有任何优化的方法可以使用Rails导出超过100K条记录的CSV?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我的数据库中有20万个位置。所以我想将所有位置导出为CSV格式。这样做的同时,下载时间太长。在rails中优化代码的最佳方法是什么 在控制器中: def index all_locations = Location.all respond_to do |format| format.csv { send_data all_locations.to_csv, filename: "locations-#{Date.today}.csv" }

我的数据库中有20万个位置。所以我想将所有位置导出为CSV格式。这样做的同时,下载时间太长。在rails中优化代码的最佳方法是什么

在控制器中:

 def index
    all_locations = Location.all
    respond_to do |format|
      format.csv { send_data all_locations.to_csv, filename: "locations-#{Date.today}.csv" }
    end
end
在型号中

def self.to_csv
    attributes = %w{id city address}

    CSV.generate(headers: true) do |csv|
      csv << ['Id', 'City', 'Address']

      all.each do |location|
        csv << attributes.map{ |attr| location.send(attr) }
      end
    end
end
def self.to_csv
属性=%w{id城市地址}
CSV.generate(标题:true)do | CSV|

csv我使用自己的数据运行了您的代码,并进行了一些调整。我做了以下更改,使用基准测试,我得到了7倍的增长

您的型号:

def self.to_csv
  attributes = %w{id city address}

  CSV.generate(headers: true) do |csv|
    csv << ['Id', 'City', 'Address']
    all.pluck(attributes).each { |data| csv << data }
  end
end
def self.to_csv
属性=%w{id城市地址}
CSV.generate(标题:true)do | CSV|

csv如果您使用的是Postgresql,那么您可以在
application\u record.rb

def self.to_csv_copy(attrs="*", header=[])
  rc = connection.raw_connection
  rv = header.empty? ? [] : ["#{header.join(',')}\n"]
  sql = self.all.select(attrs).to_sql
  rc.copy_data("copy (#{sql}) to stdout with csv") do
    # rubocop:disable AssignmentInCondition
    while line = rc.get_copy_data
      rv << line
    end
  end
  rv.join
end

它甚至比上述解决方案更快。

这是您网站的用户需要经常做的事情吗?数据多久更改一次?在常规基础上生成该文件并缓存结果是一种选择吗?或者这是一个由管理员管理的一次性任务,你是否考虑过没有Ruby之间的数据库导出工具?Admin会以周为单位来做。为什么不在CRON或后台作业中生成CSV文件并将其发送给管理员?有没有其他方法可以在没有后台工作的情况下完成它呢?请不要使用印度的测量工具。在其他地方不被理解,或者像“更多”--比什么更模糊的描述?
Location.to_csv_copy(%w{id city address}, ['Id', 'City', 'Address'])