Rails 5:在select中获取大量记录的最快方法

时间:2018-09-26 17:13:31

标签: ruby-on-rails ruby-on-rails-5 cocoon-gem

我有一个Rails应用程序,该模型从具有cocoon的选择集上的模型中加载超过2k个寄存器进行关联。我已经在使用select2 jQuery插件滚动它并搜索主题,但是加载速度非常慢。

<%= f.select :subject_id, options_for_select(Subject.all.map{ |c| [c.name, c.id, {}] }, f.object.subject_id), {include_blank: 'Select a subject'}, {required: true, class: "select2 "} %>

此模型从模型中加载超过2k的寄存器,并使选择加载缓慢,什么是从用户更快地从模型中加载寄存器的最佳实践?

3 个答案:

答案 0 :(得分:0)

您应该考虑使用诸如Select2之类的javascript插件,它将使您能够通过远程ajax调用搜索关联。您可以在https://select2.org/data-sources/ajax上看到Select2 ajax的运行情况。

然后,您需要在javascript中初始化select2并确保您的registers控制器响应json(还应使用Kaminari gem来对这些结果进行分页)。

每次添加对可能包含许多记录的关联的引用时,您都希望使用此远程方法来选择记录。

如果发现有许多关联需要相同的远程查找行为,则可以使用诸如SimpleForm之类的gem来帮助创建可重用的custom input来为您设置此行为。

答案 1 :(得分:0)

您永远不要一次从数据库中加载2k条记录,您的数据必须根据每个请求进行分页/限制。您将遇到Ruby性能问题(内存问题),而JS的性能将非常糟糕。

一种可能的解决方案是将记录从SQL移到Redis。因为Redis更快。然后从Redis获取数据。

要在Select2中处理大型数据集,请遵循以下plnkr:http://embed.plnkr.co/db8SXs/preview

答案 2 :(得分:0)

我得到了带有Select2参数的解决方案。我让它仅在输入最后3位数字后才开始搜索。这样,处理大量数据就不再慢了。

$(".select2").select2({
          width: '100%',
          placeholder: 'Start ',
          minimumInputLength: 2,
          tags: true
        });