2010-03-24 61 views
3

我正在玩一系列acts_as_taggable_on_steroids作为学习练习。我正在看的版本做了一些我不明白计算标签计数的东西。所以我想我会做使用PORC(普通老式Rails的计数器)版本:访问ruby计数器缓存

class Tagging < ActiveRecord::Base #:nodoc: 
    belongs_to :tag, :counter_cache => "tagging_counter_cache" 
... 

我想,当我访问tag.taggings.count但显然不是tagging_counter_cache被透明地访问?我真的必须明确地访问tag.tagging_counter_cache吗?

>> tag.taggings.count 
    SQL (0.7ms) SELECT count(*) AS count_all FROM `taggings` WHERE (`taggings`.tag_id = 16) 

相同的大小。

这很酷,如果是这样的情况,但只是想检查。

回答

2

呼吁收集

>> tag.taggings.size 

#size将在柜台缓存返回值。调用#count

>> tag.taggings.count 

将始终强制执行sql调用以获取最新的计数。

+1

'#size'会给你标签集合的大小。它并不总是等于计数器缓存值。例如,您可以在此集合中创建一个尚未保存的新对象。在这种情况下,计数器缓存列将只保存已保存对象的数量,而'#size'将返回包含新对象的集合中的对象数量。要获得计数器缓存的确切值,请使用'tag [:taggings_count]'。 'tag.taggings_count'应该可以工作,但我不确定。 – skalee 2011-01-28 17:13:08

0

您是否在迁移中创建了关联列?它需要某个地方来存储缓存。

+0

是的。直接访问tagging_counter_cache会返回正确的值。对不起,我应该在原来的qn中说清楚。 – 2010-03-28 12:48:17