6

Ich frage mich, ob der counter_cache in Single Table-Vererbung funktionieren würde.counter_cache in der Vererbung einzelner Tabellen

Für diese Modelle:

class User 
    has_many :questions 
end 

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

class SimpleQuestion < Question 
end 
class ComplexQuestion < Question 
end 

wird also die folgenden Zähler arbeiten?

create_table(:users) do |t| 
    t.integer :questions_count 
    t.integer :simple_questions_count 
    t.integer :complex_questions_count 
end 
  1. Alle von ihnen arbeiten
  2. Keiner von ihnen
  3. Nur simple_questions_count und complex_questions_count

Welche

  • Nur questions_count Arbeit
  • arbeiten? Ich rate den 3., aber ich will 4 mehr. Wenn es nicht 4 ist, wie mache ich 4 Arbeit?

    === UPDATE ===

    Hier ist ein Beispiel:

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

    So, jetzt ich will:

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

    Meine Frage ist, was das grundlegende Verhalten von :counter_cache => true ist und Ist es möglich, auf die Vererbung einzelner Tabellen anzuwenden?

    +0

    Versuchen Sie, 'simple_questions_count' und' complex_questions_count' die gleiche Anzahl zurückgeben zu lassen? Oder werden diese basierend auf einem anderen Feld in der Fragetabelle gezählt (z. B. gibt der Benutzer an, ob es eine einfache oder eine komplexe Frage ist)? – erskingardner

    +0

    'SimpleQuestion' und' ComplexQuestion' sind Unterklassen von 'Question' und haben in derselben Tabelle einen anderen' Typ'. Vielleicht gebe ich ein Beispiel. – PeterWong

    Antwort

    4

    Wenn Sie durch den Quellcode schauen, in dem ": counter_cache" implementiert ist, sieht es nicht so aus, als ob es die Zählung unterstützt, die Sie benötigen. Glücklicherweise ist es einfach, hier selbst zu rollen. Gerade Frage aktualisieren, um die Zählungen manuell zu verfolgen, etwa so:

    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

    Sollte ich 'after_create' statt' after_save' verwenden? Du meinst also der 'counter_cache' würde nicht funktionieren für' questions_count'? Wie wäre es mit 'simple_questions_count' und' complex_questions_count'? Sie arbeiten an 'gehört_zu: user,: counter_cache => true'? – PeterWong

    +0

    Ja, Sie haben Recht. Es sollte afer_create sein, nicht after_save. Nur ein Tippfehler meinerseits. Für questions_count, "counter_cache => true" würde funktionieren, aber ich denke, wenn Sie manuelle Zähler Rückrufe sowieso haben, könnte auch die Fragen_Count-Logik dort auch setzen.Für simple_questions_count und complex_questions_count bietet Rails derzeit keine integrierte Lösung an - dafür gibt es manuelle Rückrufe. –

    +0

    Ich habe das obige Code-Snippet aktualisiert, um den Tippfehler nachher zu beheben. –

    10

    konfrontiert gerade die gleiche Situation und es funktionierte für mich wie erwartet (num 4):

    Schauen Sie, Ihren Code wie folgt ändern, so dass Unterklassen würden außer Kraft setzen Eltern Verhalten:

    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 
    

    und fügen complex_questions_count und simple_questions_count Spalten zu Ihrem User

    Das ist es! Jedes Mal, wenn Sie eine Frage erstellen, wird der richtige Zähler erhöht. Getestet auf Schienen 3.2!

    +0

    Das funktionierte für mich in Rails 4.1 –