6

我想知道如果counter_cache將工作在單表繼承。counter_cache單表繼承

對於這些模型:

class User 
    has_many :questions 
end 

class Question 
    belongs_to :user, :counter_cache => true 
end 

class SimpleQuestion < Question 
end 
class ComplexQuestion < Question 
end 

所以將以下計數器工作?

create_table(:users) do |t| 
    t.integer :questions_count 
    t.integer :simple_questions_count 
    t.integer :complex_questions_count 
end 
  1. 所有這些工作
  2. 沒有他們的工作
  3. 只有questions_count工作
  4. 只有simple_questions_countcomplex_questions_count

哪一個?我猜測第三,但我想要4。如果不是4,我該如何讓4工作?

=== UPDATE ===

下面是一個例子:

id, user_id, question_content, type 
1, 3, something, SimpleQuestion 
2, 3, something, SimpleQuestion 
3, 3, something, ComplexQuestion 

所以現在我想:

user.questions_count # => 3 
user.simple_questions_count # => 2 
user.complex_questions_count # => 1 

我的問題是,什麼是的:counter_cache => true的基本行爲和有可能適用於單表繼承?

+0

您是否想讓'simple_questions_count'和'complex_questions_count'返回相同的計數值?或者那些將根據問題表上的其他字段進行計數(例如,用戶提交它是簡單問題還是複雜問題)? – erskingardner 2010-10-22 07:02:00

+0

'SimpleQuestion'和'ComplexQuestion'是'Question'的子類,在同一個表中有不同的'type'。也許我舉一個例子。 – PeterWong 2010-10-22 07:54:30

回答

4

通過查看源代碼執行「:counter_cache」的地方,它看起來不像它支持你需要的那種計數。幸運的是,在這裏推出你自己很容易。只要更新問題手動跟蹤的計數,像這樣:

class Question 
    belongs_to :user 

    after_create :increment_counts 
    before_destroy :decrement_counts 

    protected 

    def increment_counts 
    User.increment_counter :questions_count, user_id 
    User.increment_counter "#{type.pluralize.underscore}_count", user_id 
    end 

    def decrement_counts 
    User.decrement_counter :questions_count, user_id 
    User.decrement_counter "#{type.pluralize.underscore}_count", user_id 
    end 
end 
+0

不應該''after_create'而不是'after_save'?那麼你的意思是'counter_cache'對'questions_count'不起作用? 'simple_questions_count'和'complex_questions_count'怎麼樣?他們會在'belongs_to:user,:counter_cache => true'上工作? – PeterWong 2010-10-23 03:00:39

+0

是的,你是對的。它應該是afer_create,而不是after_save。只是我的一個錯字。對於questions_count,「counter_cache => true」會起作用,但是我認爲如果你要有手動計數器回調,那麼也可以把question_count邏輯放在那裏。對於simple_questions_count和complex_questions_count,Rails目前不提供內置解決方案 - 這就是手動回調的用途。 – 2010-10-25 15:19:16

+0

我已經更新了上面的代碼片段來修復after_create錯字。 – 2010-10-25 15:22:38

10

就面臨着同樣的情況,它的工作對我如你預期(NUM 4):

看,修改這樣的代碼,所以該子類會覆蓋父母的行爲:

class User 
    has_many :questions 
end 

class Question 
    belongs_to :user 
end 

class SimpleQuestion < Question 
    belongs_to :user, :counter_cache => true 
end 
class ComplexQuestion < Question 
    belongs_to :user, :counter_cache => true 
end 

並添加complex_questions_countsimple_questions_count欄,您User

這就是它!每當你創建一個問題時,它就會增加適當的計數器。在rails 3.2上測試它!

+0

這在Rails 4.1中適用於我 – 2014-06-20 12:58:49