Ruby on rails 如何有效地将ActiveRecord关系传递给控制器?

Ruby on rails 如何有效地将ActiveRecord关系传递给控制器?,ruby-on-rails,ruby-on-rails-5,rails-activerecord,Ruby On Rails,Ruby On Rails 5,Rails Activerecord,我有一个Rails视图,它大量使用作用域将数十万行的发票表过滤到数千条@invoices过滤记录@发票对象是ActiveRecord关系。 一旦用户按下视图中的按钮,就需要将这数千条记录发送给另一个控制器/模型进行处理 实现这一目标的最佳方式是什么 无法将@invoices对象作为参数传递,因此我只能想到两个选项: 1将ID数组作为如下参数传递: link_to bulk_process_path(@comprobantes.pluck(:id)), method: :post 但我担心如果有

我有一个Rails视图,它大量使用作用域将数十万行的发票表过滤到数千条@invoices过滤记录@发票对象是ActiveRecord关系。 一旦用户按下视图中的按钮,就需要将这数千条记录发送给另一个控制器/模型进行处理

实现这一目标的最佳方式是什么

无法将@invoices对象作为参数传递,因此我只能想到两个选项:

1将ID数组作为如下参数传递:

link_to bulk_process_path(@comprobantes.pluck(:id)), method: :post
但我担心如果有很多记录,我会达到服务器的post最大大小

2将原始筛选视图中涉及的范围作为参数传递,并在目标控制器中重新创建筛选器

然而,这似乎是对数据库不必要的点击。此外,如果我曾经想要实现复选框来进一步细化过滤视图,那么这种方法将不起作用

3在视图中创建临时表,将名称作为参数发送,然后从外部控制器读取?然后我必须跟踪并删除过时的临时表。看起来不太优雅

也许我遗漏了一些显而易见的东西,但似乎没有一个优雅的解决方案


任何帮助都将不胜感激。

我可以建议另一种选择

当用户进入页面并开始过滤时,您可以在会话上保存过滤器,然后对每个复选框更改执行ajax请求,并且可以在取消选中时将这些ID保存为异常,或者在选中时删除异常

您甚至可以使用WebSocket使其更加实时

如果您认为异常数组可能太大,也可以将会话存储方法更改为ActiveRecordStore,或者使用诸如redis之类的非常快的方法

这样,当用户完成筛选后,您可以执行post请求,但不需要发送任何参数,所有内容都保存在会话中。然后可以排除未选中的所有ID,并使用参数重新创建过滤器


我个人认为我会走这条路。希望这能有所帮助。

您如何处理这些需要发送到另一个控制器/模型进行处理的数千条记录?我会选择选项2。我不知道你的意思是什么,如果你添加复选框,它将不起作用。你可以发送过滤器和复选框,为什么不?或者如果可能,将它们存储在会话中,只有ID。但我的偏好是,只有在记录太多的情况下才通过过滤器。Hi@MarkMerritt这些是传递给电子发票的内部发票。我需要对它们进行预处理并将它们发送到外部服务。嗨@arieljuod。客户要求能够通过手动选中和取消选中索引视图中的复选框来微调筛选记录,所以是的,我也必须发送此数据,这几乎意味着选项1。