rails + ActiveRecord:缓存模型的所有寄存器

我有一个小模型(让我们称之为“节点”)代表树状结构。 每个节点只包含一个名称和对其父亲的引用:

class Node < ActiveRecord::Base validates_presence_of :name, :parent_id end 

表格不是很大 – 少于100个元素。 它很少更新 – 在过去4个月中,网站管理员一次添加了20个新元素。

然而,它在我的应用程序中使用了很多。 鉴于其树状结构,在某些情况下,请求会触发超过30个数据库命中(包括ajax调用,我使用了很多)。

我想使用某种缓存来降低数据库访问 – 因为表太小了,我想到缓存内存中的所有寄存器。

这可能是轨道2.3吗? 有没有更好的方法来处理这个?

你为什么不每次只加载它们以避免被多个负载击中?

这是一个简单的例子:

 before_filter :load_all_nodes def load_all_nodes @nodes = Node.all.inject({ }) { |h, n| h[n.id] = n; n } end 

这将为您提供由Node#id索引的哈希,以便您可以使用此缓存代替查找调用:

 # Previously @node = Node.find(params[:id]) # Now @node = @nodes[params[:id].to_i] 

对于小而简单的记录,在一次提取中快速加载它们是一种相当便宜的操作。

你看过任何给树状行为的插件吗?

Ryan Bates在acts_as_tree上有一个railscast ,但是acts_as_nested_set或受其启发的其他项目之一,如awesome_nested_set或acts_as_better_nested_set可能更适合您的需求。

这些项目允许您通过一个SQL查询获取节点及其所有子节点。 acts_as_better_nested_set网站很好地描述了此方法的工作原理。

在看了几个地方之后,我认为tadman的解决方案是最简单的。

为了获得更灵活的解决方案,我发现了这个要点:

http://gist.github.com/72250/

问候!