Ruby on rails 是否有任何优化的方法可以使用Rails导出超过100K条记录的CSV?
我的数据库中有20万个位置。所以我想将所有位置导出为CSV格式。这样做的同时,下载时间太长。在rails中优化代码的最佳方法是什么 在控制器中: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" }
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'])