6

Mi chiedo se il counter_cache funzionerebbe nell'ereditarietà di una singola tabella.counter_cache nell'ereditarietà di una singola tabella

Per questi modelli:

class User 
    has_many :questions 
end 

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

class SimpleQuestion < Question 
end 
class ComplexQuestion < Question 
end 

così sarà i seguenti contatori lavorare?

create_table(:users) do |t| 
    t.integer :questions_count 
    t.integer :simple_questions_count 
    t.integer :complex_questions_count 
end 
  1. Tutti loro lavoro
  2. Nessuno di loro lavoro
  3. Solo questions_count lavoro
  4. Solo simple_questions_count e complex_questions_count

Quale? Sto indovinando il 3 °, ma ne voglio altri 4. Se non è 4, come faccio a far funzionare 4?

=== === UPDATE

Ecco un esempio:

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

Quindi ora voglio:

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

La mia domanda è, qual è il comportamento di base di :counter_cache => true e è possibile applicare su ereditarietà di una singola tabella?

+0

Stai provando ad avere 'simple_questions_count' e' complex_questions_count' restituisce lo stesso numero di conteggio? Oppure quelli che stanno per contare in base ad un altro campo nella tabella delle domande (ad esempio, l'utente invia se è una domanda semplice o complessa)? – erskingardner

+0

'SimpleQuestion' e' ComplexQuestion' sono sottoclassi di 'Domanda', con diversi' tipi' nella stessa tabella. Forse do un esempio. – PeterWong

risposta

4

Guardando attraverso il codice sorgente dove è implementato ": counter_cache", non sembra che supporti il ​​tipo di conteggio di cui hai bisogno. Fortunatamente, è facile farlo da soli qui. Basta aggiornare Domanda per monitorare i conti manualmente, in questo modo:

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

Non dovrei usare 'after_create' invece di' after_save'? Quindi vuoi dire che il 'counter_cache' non funzionerebbe per' questions_count'? Che ne dite di 'simple_questions_count' e' complex_questions_count'? Funzionerebbero su 'belongs_to: user,: counter_cache => true'? – PeterWong

+0

Sì, hai ragione. Dovrebbe essere afer_create, non after_save. Solo un errore di battitura da parte mia. Per question_count, "counter_cache => true" funzionerebbe, ma immagino che se avrai comunque callback del contatore manuale, potrebbe anche mettere la logica del question_count anche lì.Per semplici_questions_count e complex_questions_count, Rails al momento non offre alcuna soluzione integrata - questo è ciò che le callback manuali servono. –

+0

Ho aggiornato lo snippet di codice sopra per correggere il typo after_create. –

10

appena affrontato la stessa situazione e ha funzionato per me come ti aspettavi (num 4):

sguardo, modificare il codice come questo, in modo da che le sottoclassi avrebbero ignorare il comportamento dei genitori:

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 

e aggiungere complex_questions_count e simple_questions_count colonne al tuo User

Ecco fatto! ogni volta che crei una domanda, incrementerebbe il contatore corretto. Testato su rotaie 3.2!

+0

Questo ha funzionato per me in Rails 4.1 –