我试图为导航栏上的每个链接添加计数。导航栏上的每个链接都会转到不同的模型。
每次访问者导航到另一个页面时,我都希望避免查询和计算多个模型的记录。
如何缓存此信息?
counter_cache
似乎只适用于协会。这些是独立的模型,无需关联。
答案 0 :(得分:1)
你可以使用简单的Model.count
,它执行MySQL计数查询,这不应该花费太多。
然后是活动记录缓存,它将查询结果缓存为查询字符串作为缓存键,任何后续请求都会到达缓存,甚至不会再次执行查询,它将直接返回从查询缓存中,所以我认为它根本不会很昂贵。
修改强>:
关于.size
,它是enumerable
的方法,就像数组一样,使用它需要获取结果集来计算它的大小,结果集是你不需要的额外数据,你只是对计数感兴趣,所以你应该告诉数据库获取计数,因此Model.count
,这是我已有的应用程序的一个例子:
User.count
(0.2ms) SELECT COUNT(*) FROM `users`
User.all.size
User Load (71.4ms) SELECT `users`.* FROM `users`
请注意查询中的差异,以及响应时间的差异,第一个非常快,因为它已经被缓存了。
关于索引,在mysql(我认为任何尊重的数据库)中,任何主键都应该是唯一的和索引的,因为这是记录的主要标识符,你不需要在迁移中指定它,rails创建了通过它自动增加唯一主键,它是默认的,它甚至不会出现在迁移文件中,以禁用创建主键,您需要添加一个很少需要的额外选项id: false
。 / p>