2012-05-22 42 views
3

我的页面出现问题,需要很长时间才能刷新下拉列表。基本上在更改表单中的一个下拉值时,第二个下拉列表的潜在选项更改为不同的列表。如何缓存/加速Ruby on Rails中的下拉框数据

如何加快速度?如果可以提供帮助,我正在使用REDIS。

谢谢!

+0

如果你看看'log/development.log',有没有明显缓慢的查询或部分呈现? – tadman

+0

我非常理解这些查询,我真的很期待缓存或其他方法的信息,当有人在浏览器中更改下拉列表时,不需要在服务器上进行数据库查找。 –

回答

2

如果您有您的主要选择的几个选项,那么你可以设置在阵列中的一个js哈希所有可能的辅助选项,当你第一次渲染页面,然后在初级的变化,查找与此客户端JS数组 - 这显然很快,但如果选项太多,可能会减慢初始页面加载或膨胀页面大小。

另一种方式将仍然能够在主选择改变一个Ajax调用,但缓存返回第二选项的动作。这将允许它根据请求的参数进行缓存,并尽可能在rails缓存中使用渲染的结果(而不是总是碰到redis或db)。

+0

我正在将所有可能的选项存储在客户端散列中。一些下拉菜单有很多选项。这会减慢初始页面加载速度。一般来说,这是一个很好的建议 - 但是我这样做了,在这种情况下,它会减慢初始页面加载的速度。 –

+0

您可以在文件中加载辅助选项,然后使用脚本标记将它们添加到页面中(该文件甚至可以在浏览器以及服务器端缓存)。这应该有助于初始页面加载,但缺点是您可能必须禁用更改主要选择,直到加载脚本文件。 –

2

来自Andrew Kuklewicz的很棒回答。要添加到它...

使用Rails的 “Fragment Caching”。

如果你把它发送给客户端的页面加载,example.html.erb:

<% cache do %> 
    <script> 
    var javascript_hash = {name: '<%[email protected]_val%>'}; 
    </script> 
<% end %> 

如果你需要缓存的AJAX动作的输出,example.js.erb:

<% cache do %> 
    alert('hello from javascript'); 
<% end %> 

另外,在你的动作本身中,确保你只是实例化ActiveRecord :: Relation's而不是实际执行查询:

Company.where({name: 'foo'}) # this 
Company.where({name: 'foo'}).all # not this 
+0

我正在将所有可能的选项存储在客户端散列中。一些下拉菜单有很多选项。这会减慢初始页面加载速度。一般来说,安德鲁是一个很好的建议 - 但是我这样做了,在这种情况下,它减缓了初始页面负载。 –

+0

我刚刚更新了答案......现在可能更有意义。 – tybro0103

1

低技术方法可能是呈现静态JSON或JavaScript文件,该文件可由包含辅助下拉内容的客户端缓存。

最简单的版本,只是将一些路径,比如/cache/drop_down.state1.js等等,其中客户端获取这些需求。您可以使用Rails页面缓存系统自动将这些结果保存到/public中,以便后续请求转到之前创建的同一个JavaScript,从而无需往返数据库。它们也可以根据需要过期。

您可以为每个下拉单独做到这一点,或者如果可行,所有下拉菜单一次,然后包括它并选择从列表中的相应的键。

这要求构建出客户端脚本来动态创建和填充包括:如果一个应当被预先选择选择合适的条目二次下拉字段。不过,使用jQuery等帮助程序库并不困难。