我有一个Rails视图,它大量使用作用域来过滤一个由数十万行到几千行@invoices
过滤记录的发票表。@invoices
对象是ActiveRecord关系。一旦用户按下视图中的一个按钮,就需要将这数千条记录发送给另一个控制器/模型进行处理。
实现这一目标的最佳方法是什么?
将@invoices
对象作为param传递是不可能的,因此我只能想到两个选项:
1)将ids数组作为参数传递,如下所示:
link_to bulk_process_path(@comprobantes.pluck(:id)), method: :post
但是我担心如果有很多记录的话我会击中服务器的最大大小
2)将原始过滤视图所涉及的作用域作为参数传递,并在目标控制器中重新创建过滤器。
然而,这似乎是对数据库的不必要的点击。此外,如果我想实现复选框以进一步细化筛选的视图,则此方法将无法工作。
3)在视图中创建临时表,将名称作为参数发送,然后从外部控制器读取它?然后,我必须跟踪并删除陈旧的临时表。看起来不太优雅。
也许我遗漏了一些显而易见的东西,但似乎没有一个优雅的解决方案。
任何帮助都将不胜感激。
发布于 2018-08-28 10:26:19
我可以提出另一种选择。
当用户进入页面并开始过滤时,您可以将筛选器保存在会话上,然后对每个复选框更改执行ajax请求,并且可以在未选中时将这些ids保存为异常,或者在选中异常时将其删除。
您甚至可以使用websockets使其更实时。
您还可以将会话存储方法更改为ActiveRecordStore,如果您认为异常数组可能太大,或者使用像redis这样的非常快速的方法。
这样,当用户完成对筛选器的最终处理后,您将执行post请求,但不需要发送任何params,所有内容都保存在会话中。然后,可以排除未选中的所有ids,并使用参数重新创建筛选器。
我个人认为我会走这条路。希望这能有所帮助。
https://stackoverflow.com/questions/52048845
复制相似问题