gpt4 book ai didi

ruby - 如何在不使用全局或 session 变量的情况下重用查询结果以更快地导出到 csv 和 xls

转载 作者:太空宇宙 更新时间:2023-11-03 16:00:05 29 4
gpt4 key购买 nike

我有一项功能,最初以 HTML(报告)形式显示结果,然后可以导出为 CSV 和 XLS

想法是重用用于呈现 HTML 的查询的结果,导出相同的记录而无需再次重新运行查询

最接近的实现是这样的:将结果存储在全局变量 $last_consult 中

我在 Ruby Controller 中有以下 INDEX 方法

  def index
begin
respond_to do |format|
format.html {

@filters = {}
@filters['email_enterprise'] = session[:enterprise_email] ;

# Add the selected filters
if (params[:f_passenger].to_s != '')
@filters['id_passenger'] = params[:f_passenger] ;
end
if (session[:role] == 2)
@filters['cost_center'] = session[:cc_name]
end

# Apply the filters and assign them to $last_consult that is used
$last_consult = InfoVoucher.where(@filters)
@info_vouchers = $last_consult.paginate(:page => params[:page], :per_page => 10)

estimate_destinations (@info_vouchers)
@cost_centers = fill_with_cost_centers(@info_vouchers)
}
format.csv {
send_data InfoVoucher.export
}
format.xls {
send_data InfoVoucher.export(col_sep: "\t")
}

.export 方法是这样定义的

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

default_scope { order('voucher_created_at DESC') }

def attributes
instance_values
end

#Exporta a CSV o XLS
def self.export(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

$last_consult.each do |row_export|
csv << row_export.attributes['attributes'].values_at(*column_names)
end
end
end

end

但这种方法只适用于在查看报告和导出报告之间没有并发用户的情况,在这种情况下是 Not Acceptable

我尝试使用一个 session 变量来存储查询结果,但由于查询结果可能会完全失败并出现此错误

ActionDispatch::Cookies::CookieOverflow: ActionDispatch::Cookies::CookieOverflow

我读过有关 Flash 的内容,但我认为它不是一个好的选择

能否请您指出正确的方向,了解如何保留查询结果,目前存储在 $last_consult 中,并使其在不使用全局或 session 变量的情况下可用于 CSV 和 XLS 导出

最佳答案

Rails 4 有一堆缓存解决方案:

  • SQL 查询缓存:在请求期间缓存查询结果集。

  • 内存缓存:限制为 32 MB。一个示例使用是小集合,例如生成耗时的对象 ID 列表,例如复杂选择的结果。

  • 文件缓存:非常适合取得巨大成果。可能不是您想要的特定数据库查询,除非您的结果很大并且您使用的是 RAM 磁盘或 SSD。

  • Memcache 和 dalli:一种出色的快速分布式缓存,独立于您的应用。对于您的问题,对于向多个用户返回相同结果或报告的应用,内存缓存可能是一个非常好的解决方案。

  • Terracotta Ehcache:这是企业级和 JRuby。我没有亲自使用过它。如果您正在构建一个严肃的主力应用程序,那么看起来很好。

当您使用其中任何一个时,您不会将信息存储在全局变量或 Controller 变量中。相反,您通过创建唯一的缓存键来存储信息。

如果您的信息特定于特定用户,例如用户最近的查询,那么唯一缓存键的一个不错的选择是 "#{current_user.id}-last-consult" .

如果您的信息在用户之间是通用的,例如依赖于您的过滤器而不是特定用户的报告,那么唯一缓存键的一个不错的选择是 @filters.hash

如果您的信息特定于特定用户以及特定过滤器,唯一缓存的一个不错的选择是 "#{current_user.id}-#{@filters.hash}"。这是缓存特定于用户的信息的强大通用方法。

我在 Redis 缓存 gem 方面取得了巨大的成功,它可以独立于 Rails 4 缓存工作。 https://github.com/redis-store/redis-rails

我找到了这篇关于您提到的大部分缓存策略的精彩文章 http://hawkins.io/2012/07/advanced_caching_part_1-caching_strategies/

关于ruby - 如何在不使用全局或 session 变量的情况下重用查询结果以更快地导出到 csv 和 xls,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27281978/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com