2010-03-24 71 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