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

时间:2018-08-28 01:24:03

标签: ruby-on-rails ruby-on-rails-5 rails-activerecord

我有一个Rails视图,该视图大量使用范围来筛选数十万行的Invoice表,直到数千@invoices个过滤记录。 @invoices对象是ActiveRecord关系。 用户按下视图中的按钮后,就需要将这数千条记录发送给其他控制器/模型进行处理。

哪种方法是实现这一目标的最佳方法?

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

1)将ID数组作为参数传递,如下所示:

link_to bulk_process_path(@comprobantes.pluck(:id)), method: :post

但是我担心如果有很多记录,我会达到服务器的最大发布大小

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

但是,这似乎对数据库造成不必要的打击。此外,如果我想实现复选框以进一步优化过滤后的视图,则此方法将不起作用

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

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

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我可以建议另一个选择。

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

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

如果您认为exceptions数组可能太大,或者使用redis之类的东西,那也可以将会话存储方法更改为ActiveRecordStore,这确实非常快。

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

我个人认为我会这样。希望这会有所帮助。