我有一个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的寄存器,并使选择加载缓慢,什么是从用户更快地从模型中加载寄存器的最佳实践?
答案 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
});