2011-10-04 27 views
1

在我的应用程序中有对象,它们属于国家,地区,城市,类型,团体,公司和其他集合。每个集合都很简单 - 它有id,name,有时还有一些指向其他集合的指针,并且它永远不会改变。一些集小,我打开他们的before_filter这样的:在rails中缓存一堆简单的查询

@countries = Country.all 
@regions = Region.all 

但后来我打电话,例如, offer.country.name 或 region.country.name 和我的应用程序进行单独的数据库按ID查询,尽管我已经加载了它们全部。在此之后,我通过:include执行查询,并且这种情况通过急切加载生成的ids不依赖于我已经使用另一个按查询ID加载了这些数据。

所以我想要一些缓存。例如,我可以用keys生成散列作为records_id在我的before_filter中,然后调用@countries [offer.country_id] .name。这种情况下,似乎我不需要急切的加载,这很容易在这里打开Rails.cache。但也许有一些聪明的内置导轨解决方案,不需要重写所有内容?

回答

1

缓存像这样的模型列表不会缓存其他模型关联中存在的单个实例。

Rails团队一直致力于在Rails 3.1中实现Identity Maps来解决这个确切问题,但现在它默认是禁用的。您可以启用它并查看它是否适合您的问题。

+0

我切换到Rails 3.1并打开了身份映射,看起来他们工作,所以我只有每个@country = Country.find(1)的一个实例。但它不完全是我想要的,因为身份映射不会减少对数据库的查询次数。理想情况下,必须有一个sql解析器来比较两个查询,并发现其中一个结果(部分)与另一个匹配。常见的任务很复杂,但在活动记录查找(:ids)和所有方法中使用一些cache-by-id似乎相当容易。 – Kasheftin