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

2024-02-11

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

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

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

我在 Ruby 控制器中有以下 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

但这种方法只有在查看报告和导出报告之间没有并发用户的情况下才有效,在这种情况下这是不可接受的

我尝试使用会话变量来存储查询结果,但由于查询的结果可能相当大,因此会失败并出现此错误

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

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

您能否为我指明如何保留查询结果(当前存储在 $last_consult 中)的正确方向,并使其可用于 CSV 和 XLS 导出,而无需使用全局或会话变量


Rails 4 有很多缓存解决方案:

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

  • 内存缓存:限制为 32 mb。一个示例用途是小集合,例如生成起来很耗时的对象 ID 列表,例如复杂的结果select.

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

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

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

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

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

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

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

我使用 Redis 缓存 gem 取得了巨大的成功,它可以与 Rails 4 缓存分开工作。https://github.com/redis-store/redis-rails https://github.com/redis-store/redis-rails

我发现这篇很棒的文章介绍了您提到的大多数缓存策略http://hawkins.io/2012/07/advanced_caching_part_1-caching_strategies/ http://hawkins.io/2012/07/advanced_caching_part_1-caching_strategies/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不使用全局或会话变量的情况下重用查询结果以更快地导出到 csv 和 xls 的相关文章

  • 将表列添加到 Group by 子句 - Ruby on Rails - Postgresql

    我正在尝试使用 Heroku 显然 Postgresql 对于聚合函数来说比 SQL 严格得多 当我推送到 Heroku 时 我收到一条错误消息 内容如下 关于另一个问题 https stackoverflow com questions
  • 如何使用 ruby​​zip 库获取压缩文件的内容?

    我正在尝试提取上传的 zip 文件并将其内容存储在数据库中 每个文件一个条目 rubyzip 库几乎没有有用的文档 有一个资产表 其中包含键 string 文件名 和数据 binary 文件内容 我正在使用 ruby zip 库 并且已经做
  • Ruby 多维数组

    也许只是我缺乏在这里找到东西的能力 这就是问题所在 但我找不到任何关于如何在 Ruby 中创建多维数组的信息 有人可以给我一个如何做的例子吗 严格来说 在 Ruby 中创建多维数组是不可能的 但是可以将一个数组放入另一个数组中 这与多维数组
  • 随机化数组元素

    我有一个数组 number 1 2 3 4 5 6 7 8 9 现在 我想随机化数组内容 例如 5 3 2 6 7 1 8 请指导我如何继续 Use the shuffle方法 irb main 001 0 gt 1 2 3 4 5 shu
  • Ruby 中 SecureRandom.urlsafe_base64(8) 的碰撞概率?

    我在用SecureRandom urlsafe base64 8 为了在我的系统中创建 URL 安全的唯一 ID 我想知道如何计算碰撞概率 我将大约 10 000 个这些 id 插入到一个数组中 我想避免检查其中一个键是否已经在数组中 但我
  • 带有可选第一个哈希参数和keyword_args的奇怪方法行为

    我有以下方法 def test first param nil keyword arg nil puts first param first param puts keyword arg keyword arg end 以下所有调用都按照我
  • 安装了 Rails 但它说我没有:)

    我刚刚执行了这个命令来安装 Rails gem install rails 它似乎运行良好并安装了东西 然后当我按照本教程进行操作时 http guides rubyonrails org getting started html http
  • 使用 Ruby 替换文件中的特定行

    我有一个如下所示的文本文件 a txt open close open open close open 我需要找到一种方法将第三行替换为 close 我做了一些搜索 大多数方法都涉及搜索该行而不是替换它 在这里不能真正做到这一点 因为我不想
  • 在所有延迟的作业之前挂钩

    是否可以在所有delayed job任务之前运行一个方法 基本上 我们试图确保每台运行delayed job的服务器都有我们代码的最新实例 因此我们希望运行一个方法来在每个作业运行之前检查这一点 我们已经有了 check 方法并在其他地方使
  • 如何将 STDOUT 捕获到字符串?

    puts hi puts bye 我想存储到目前为止代码的 STDOUT 在本例中 hi nbye 到变量中说 结果 并打印它 puts result 我这样做的原因是我已将 R 代码集成到我的 Ruby 代码中 当 R 代码运行时 其输出
  • Ruby - :variable 和 @variable 之间的区别

    作为 Ruby on Rails 新手 我知道 和 引用具有不同的含义 我看见这个帖子 https stackoverflow com questions 3538575 whats the difference between and v
  • heroku 语言区域设置不工作 I18n::MissingTranslationData

    在我的本地电脑上一切正常 但在 heroku 上我收到错误 我的 Heroku 控制台 PC HOME PC c rails konkurranceportalen master heroku console Ruby console fo
  • Rails:将参数从视图传递到控制器

    我在 Rails 中有以下模型 class Task lt ActiveRecord Base attr accessible description name project belongs to project validates na
  • 如何阻止“gem”实用程序访问我的主目录?

    当我跑步时 gem install
  • Rails 2.3.14:如何序列化 ActionController::Request 对象?

    我需要编写一些根据 Rails 2 3 14 控制器收到的请求对象类型执行操作的方法 但是 我不想启动整个应用程序 甚至不想启动控制器 我只想拥有这样一个对象的编组副本 以便我可以在 Rails 环境之外使用 不幸的是 ActionCont
  • 日期时间到 NSDate

    如何转换字符串2010 11 19T20 00 00Z进入一个NSDate object 我尝试过使用 dateFormatter setDateFormat yyyy MM ddTHH mm ssZ 但看起来我的自定义格式样式错误 PS
  • 忽略 GEM,因为它的扩展尚未构建

    在我的工作和家用计算机上 我最近将 Ruby 升级到 2 3 1 使用ruby install I use chruby作为我的 Ruby 切换器 我开始在我的终端中看到这个警告 Ignoring bcrypt 3 1 11 because
  • 模块何时包含在在 Rails 中运行的 Ruby 类中?

    我正在尝试编写一个方法来告诉我包含特定模块的每个类 它看起来像这样 def Rating rateable objects rateable objects ObjectSpace each object Class do c next u
  • 更快地将数据库从一个heroku应用程序传输到另一个应用程序

    有没有更快的方法将我的生产数据库传输到测试应用程序 目前我正在做一个heroku db pull然后到我的本地机器heroku db push app testapp但这变得越来越耗时 我有一些种子数据 但它并不像简单地使用我的真实数据进行
  • 设计重定向到成功登录似乎在第一次登录尝试时卡住

    我正在使用 Ruby on Rails 开发一个小型应用程序 并使用 Devise 进行身份验证 我有两个登录系统设置 一个是user另一个是employee 当使用正确的电子邮件和密码登录时 设计会发送正确的重定向到返回路径 但它会卡在那

随机推荐

  • 在 perl 中读取和写入文件

    this is just an example 假设上面是out txt 我想读书out txt并写入同一个文件
  • 在 Android 中从纬度/经度获取企业名称或地标

    好吧 我已经为此搜索了相当长的时间 我有一个距我新发现的位置的纬度 经度 geocoder 的 getFromLocation 从纬度 经度返回一定数量的地址 这一切都很好 然后我将它放入一个适配器中 该适配器填充了一个旋转器 也运行得很好
  • UIButton 在单元格被触摸时也会突出显示

    I ve a UIButton在我弹出的表格单元格上 touchUpInside a UIAlertView并询问用户是否要删除与该单元格关联的文件 否则 触摸单元格本身会突出显示该单元格 然后移动到下一个级别以显示内容 问题是当细胞sel
  • 如何在一定时间后重试功能请求

    如果用户数据为空 如何让它重试发送尝试 最多重试 2 次 10 秒后重试 1 次 public class UserHandler private List users new ArrayList public void addUser u
  • 绕过 requiredfieldvalidator

    我有一个网络表单 上面有验证器 当用户按下提交按钮时 验证器可以很好地工作 但是 当用户按下注销按钮时 验证器会停止该按钮的工作 关于如何解决这个问题有什么建议吗 您需要使用CausesValidation按钮上的属性
  • nf_conntrack_helper注册未注册端口返回错误

    我有以下代码从内核 3 18 取消注册和注册 sip conntrack static void nf conntrack sip fini void int i j for i 0 i lt ports c i for j 0 j lt
  • 在没有 gitosis/gitolite 的情况下通过 SSH 运行“安全”git 服务器?

    是否可以通过 ssh 运行 git 服务器 使用authorized keys and command 限制仅访问 git 存储库 而不使用 gitosis gitolite 是的 分配git shell http www kernel o
  • 获取 Youtube 数据 API 的 403 禁止错误

    我在对 YouTube 数据 API 进行 API 调用时收到 403 禁止错误 我尝试生成不同类型的密钥 Web 浏览器 服务器等 钥匙不受限制 我尝试从服务器和 Chrome 的邮递员拨打电话 请求 URL 和响应如下 https ww
  • 访问 AVRO GenericRecord (Java/Scala) 中的嵌套字段

    我有一个带有嵌套字段的 GenericRecord 当我使用genericRecord get 1 它返回一个包含嵌套 AVRO 数据的对象 我希望能够像这样访问该对象genericRecord get 1 get 0 但我不能 因为 AV
  • 在 woocommerce 中隐藏折扣信息而不取消优惠券

    我在 Woocommerce 购物车中使用优惠券进行计算 它会自动为总额添加折扣 以便可以将正确的金额发送到支付网关 我想向访客隐藏有关此优惠券 折扣的所有信息 Problem 我发现的唯一方法 见下文 隐藏优惠券字段 行 总计 和消息 但
  • COBOL:GDG 文件描述符 (FD) 可以引用多代吗?

    我有一个程序可以读取 GDG 文件并将数据移动到工作存储 我很想知道是否可以使用对文件定义的引用对多代 GDG 重复此过程 也许有一种方法可以在文件定义上使用下标 我的想法是必须有一种方法将不同的文件定义移动到引用变量中以访问文件 基于建议
  • 如何检测设备是否支持鼠标?

    我目前使用以下测试 取自 Modernizr 来检测触摸支持 function is touch device var bool if ontouchstart in window window DocumentTouch document
  • 我的树形图的 Arangodb 自定义过滤器/访问者

    我有一个带有两个边定义的图 如下所示 isDepartment organisation gt organisation hasAccess user gt organisation 组织嵌套在树中 无循环 有多个顶级组织 没有任何传入is
  • 使用 shell 脚本从 sql 脚本中选择列到局部变量中

    如何将从表中检索到的列值存储到 shell 脚本中的变量中 我有以下代码 usr bin ksh echo This script will try to connect to sql plus and displays the date
  • 为什么在释放指针后取消引用它时会得到不同的结果?

    我有一个关于 C 内存管理的问题 以及 Debian GNU Linux 下的 GCC 4 3 3 根据 K R 的 C 编程语言书籍 第 7 8 5 章 当我释放指针然后取消引用它时 会出现错误 但我有一些疑问 因为我注意到有时 正如我在
  • 在 Flask 中,设置 cookie,然后重定向用户

    看起来在 Flask 中 cookie 是通过直接修改响应对象来设置的 如何返回响应对象 同时在成功登录后将用户重定向到不同的页面 我想专门重定向用户而不是呈现不同的页面 以防用户点击刷新 这是我当前的代码 它仅显示同一页面 login h
  • popen()/fgets() 间歇性返回不完整的输出

    我遇到了一个奇怪的问题popen and fgetsLinux系统上的库函数 演示该问题的简短程序如下 安装信号处理程序SIGUSR1 创建辅助线程来重复发送SIGUSR1到主线程 在主线程中 通过以下方式重复执行一个非常简单的 shell
  • rsync 无法解释的错误(代码 129)

    我正在尝试将数据从一台服务器 rsync 到另一台服务器 大约有大约 1 1T 的数据 但是当我进行 rsync 时 我在传输过程中遇到以下异常 从而终止了进程 rsync 错误 rsync c 541 sender 3 0 7 出现无法解
  • uint8 的冗余转换不适用于 GCC 4.8.1

    我有一些遗留代码 通常是使用 GCC 3 4 4 为 PowerPC 编译的 现在我正在移植一些我想用 MinGW 的 GCC 4 8 1 编译的代码部分 在代码中的某个时刻我发现了这一点 Prototypes void foo uint8
  • 如何在不使用全局或会话变量的情况下重用查询结果以更快地导出到 csv 和 xls

    我有一个功能 最初以 HTML 报告 显示结果 然后 可以导出为 CSV 和 XLS 这个想法是重用用于呈现 HTML 的查询的结果 导出相同的记录 而无需再次重新运行查询 最接近的实现是这样的 将结果存储在全局变量 last consul